web-dev-qa-db-fra.com

Efficace et rapide Python Boucle While lors de l'utilisation de sleep ()

J'essaie de communiquer avec un périphérique via série en utilisant Pyserial. Comme les commandes doivent être envoyées en continu, elles doivent être placées dans une boucle while en Python.

J'utilise actuellement ce code, et j'ai jeté un coup d'œil à le processus python prend 100% de CP :

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 semble charger un peu trop le CPU.

En bref, existe-t-il un moyen d'itérer efficacement sur une boucle while pour toujours, tout en conservant une faible consommation de ressources CPU?

29
jhtong

La partie lente du gaspillage CPU est le "envoi en série". La boucle while avec une courte veille utilisera un processeur négligeable.

Pouvez-vous montrer le code d'envoi en série. Il peut y avoir un moyen d'accélérer cela.

Sur ce processeur 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

Faites maintenant un 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 exécuté ceux-ci dans l'interpréteur et arrêté chaque boucle while avec ctrl-C.

55
John La Rooy

En ce qui concerne votre commentaire sur la réponse de Joachim:

Ensuite, votre code de microcontrôleur a besoin d'une refonte. Sinon, vous transformez simplement votre ordinateur polyvalent en rien de plus qu'un "microcontrôleur" stupide qui répète à plusieurs reprises le code inutile, d'où le processeur 100%. Un autre symptôme de l'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 devez le "commander" avec l'ordinateur qui hébergera votre logique de haut niveau. Et votre microcontrôleur doit gérer le contrôle répétitif de bas niveau du moteur.

6
Zoran Pavlovic

Vous devez déterminer le compromis que vous êtes prêt à avoir entre la vitesse et la charge du processeur.

Si vous devez envoyer de courtes rafales de données, tout en ne faisant pas autant entre les messages, vous pouvez peut-être vivre avec une charge CPU élevée pendant une courte période car la moyenne peut toujours être faible.

3