Efficace et rapide Python tout en boucle tout en utilisant le sommeil()
j'essaie de communiquer avec un appareil en série en utilisant Pyserial. Comme les commandes doivent être envoyées continuellement, elles doivent être placées dans une boucle while en Python.
j'utilise actuellement ce code, et j'ai regardé le processus python prend 100% CPU :
while True:
#do some serial sending here
time.sleep(0.2)
ce code fonctionne. Cependant, la vitesse d'envoi est lente. J'ai essayé de le rendre plus rapide en diminuant l'intervalle sleep
, mais il on dirait que le processeur est un peu trop chargé.
en bref, y a-t-il un moyen d'itérer efficacement sur une boucle de temps pour toujours, tout en maintenant une faible consommation de ressources CPU?
3 réponses
la partie lente du dépérissement CPU est l' "envoi en série". La boucle while avec juste un sommeil court utilisera CPU négligeable.
pouvez-vous afficher le code d'envoi en série. Il y a peut être un moyen à la vitesse.
sur ce CPU plutôt lent je vois ceci:
import time
while True: time.sleep(0.2) # 0% CPU
while True: time.sleep(0.02) # 0% CPU
while True: time.sleep(0.002) # 0.5% CPU
while True: time.sleep(0.0002) # 6% CPU
while True: time.sleep(0.00002) # 18% CPU
maintenant faire un peu de travail supplémentaire dans la boucle:
import time
while True: range(10000) and None; time.sleep(0.2) # 1% CPU
while True: range(10000) and None; time.sleep(0.02) # 15% CPU
while True: range(10000) and None; time.sleep(0.002) # 60% CPU
while True: range(10000) and None; time.sleep(0.0002) # 86% CPU
j'ai lancé ceux de l'interpréteur et je les ai arrêtés en boucle avec Ctrl-C.
en ce qui concerne votre commentaire sur la réponse de Joachim:
alors votre code de microcontrôleur doit être redessiné. Autrement, vous ne faites que transformer votre ordinateur universel en rien de plus qu'un stupide "microcontrôleur" qui itère sur du code inutile à plusieurs reprises, d'où le 100% cpu. Un autre symptôme de votre utilisation incorrecte de votre ordinateur est le fait que la vitesse de votre moteur matériel dépend de la vitesse à laquelle vous lui envoyez des commandes via l'interface série. Vous avez besoin pour le "commander" avec l'ordinateur qui hébergera votre logique de haut niveau. Et votre micro-contrôleur doit gérer le contrôle de bas niveau, repetative du moteur.
vous devez comprendre le compromis que vous êtes prêt à avoir entre la vitesse et la charge CPU.
si vous devez envoyer de courtes rafales de données, tout en ne faisant pas tellement entre les messages, alors peut-être que vous pouvez vivre avec une charge CPU élevée pour une courte période que la moyenne pourrait encore être faible.