-2
votes

Programme de python extrêmement simple qui prend 100% de la CPU

J'ai ce programme qui vérifie la quantité de CPU utilisée par le processus actuel Python.

import cv2

cap = cv2.VideoCapture("video.mp4")
while True:
    success, frame = cap.retrieve()


3 commentaires

Pourquoi est-il surprenant que la capture de cadres vidéo dans une boucle serrée prend tout votre temps de processeur disponible? Vous demandez à votre ordinateur de faire beaucoup de travail, à plusieurs reprises.


Non, op était comparer le programme de la vérification du processeur à un programme de capture de cadres vidéo


Et quant à votre premier programme, si vous ne mettez pas de dormez là-bas, il n'a pas vraiment d'importance que vous utilisez le compteur du tout. Votre ordinateur peut compter sur 1000 très rapidement et utiliser un CPU à cela aussi.


3 Réponses :


1
votes

J'espère que vous allez bien!

Lorsque vous faites: p> xxx pré>

Vous demandez réellement à votre ordinateur de traiter constamment. p>

Il va augmenter compteur code> aussi vite que possible et affichera le cpu_percent code> chaque fois compteur code> est modulo de 1000 . P>

Cela signifie que votre programme alimente constamment la CPU avec les instructions d'incrémentation de ce compteur. P>

Lorsque vous utilisez le sommeil, vous dites essentiellement au système d'exploitation (système d'exploitation) que votre Le code ne devrait pas exécuter quelque chose de nouveau avant le sommeil. Votre code ne mettra alors à inonder la CPU avec des instructions. P>

Dormir suspend son exécution pour le nombre donné de secondes. P>

Il est préférable d'utiliser un sommeil que le compteur. P>

import os
import psutil
import time
p = psutil.Process(os.getpid())

counter = 0
while True:
    time.sleep(1)
    print(p.cpu_percent())


0 commentaires

1
votes

Votre boucle d'origine fait quelque chose aussi vite que possible. Tout programme qui fait du travail purement lié à la CPU, sans opérations de blocage significatifs impliqués, sera heureux de consommer tout le CPU, mais il fait tout ce qu'il fait plus vite si le processeur est plus rapide.

Votre particulier est surtout incrémenté une valeur et la divisant par 1000 encore et encore, ce qui est inefficace, mais la rendant plus efficace, par exemple En modifiant la boucle à: xxx

supprimer tout le travail de division et avoir un ajout plus efficace ( plage fait l'œuvre de la couche C), serait juste que vous voulez dire que vous faites les 1000 boucles plus rapidement et impression le cpu_percent plus souvent (cela pourrait légèrement réduire la consommation de la CPU, mais seulement parce que vous pourriez Soyez suffisamment d'impression que le tampon de sortie est rempli plus rapidement qu'il ne peut être drainé pour l'affichage et votre programme pourrait finir de manière occasionnelle sur des E / S).

point est, Si vous dites à l'ordinateur de faire quelque chose pour toujours aussi vite que possible, cela le fera. Alors ne le fais pas. Utilisez un dormir ; Même un petit ( temps.sleep (0.001) ) ferait une énorme différence.

Pour votre scénario de capture vidéo, on dirait que c'est ce que vous voulez en premier lieu. Si la source vidéo produise suffisamment de sortie pour occuper votre CPU entier, alors soyez-le; Si ce n'est pas le cas, et que votre code bloque quand il va de l'avance, c'est génial, mais vous ne voulez pas ralentir le traitement uniquement pour l'utilisation de la CPU inférieure si cela signifie tomber derrière / déposer des cadres.


0 commentaires

1
votes

Vous voudrez peut-être ajouter une fois.sleep (NumberOfseconds) à votre boucle si vous ne voulez pas qu'il utilise 100% de processeur tout le temps, s'il ne s'agit que d'une certaine condition. Je pense que cela résoudra votre problème


0 commentaires