2009-04-24 5 views
36

J'ai un thread qui interroge un morceau de matériel.Comment un threading.Thread cède le reste de son quantum en Python?

while not hardware_is_ready(): 
    pass 
process_data_from_hardware() 

Mais il y a d'autres threads (et processus!) Qui pourraient avoir des choses à faire. Si c'est le cas, je ne veux pas brûler cpu vérifier le matériel toutes les autres instructions. Cela fait un moment que j'ai traité le threading, et quand je l'ai fait, ce n'était pas Python, mais je crois que la plupart des librairies ont une fonction yield ou quelque chose qui permet à un thread de dire au planificateur "Donner une chance aux autres threads. "

while not hardware_is_ready(): 
    threading.yield()   # This function doesn't exist. 
process_data_from_hardware() 

Mais je ne trouve aucune référence à quelque chose comme ça dans la documentation de threading. Python a une instruction yield, mais je suis à peu près sûr que c'est autre chose (à propos des générateurs).

Quelle est la bonne chose à faire ici?

Répondre

55

time.sleep(0) est suffisant pour donner le contrôle - pas besoin d'utiliser un epsilon positif. En effet, time.sleep(0) MOYENS "céder à n'importe quel autre fil peut être prêt".

+4

Est-ce documenté quelque part? Je pensais que cela pourrait être vrai - je l'ai vu dans d'autres langues - mais je ne pouvais pas trouver une mention dans les docs Python. –

+3

par exemple, http://docs.python.org/library/sched.html "delayfunc sera également appelé avec l'argument 0 après que chaque événement est exécuté pour permettre aux autres threads de s'exécuter dans des applications multithread." (delayfunc est généralement time.sleep ici). Je suis d'accord qu'il serait plus agréable si cela était documenté plus directement dans le module de temps ;-) –

+1

Bien caché! Merci! –

11

Lire sur le verrou Global Interpreter (GIL).

Par exemple: http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/

aussi: http://www.pyzine.com/Issue001/Section_Articles/article_ThreadingGlobalInterpreter.html

Faites ceci dans votre code si vous devez faire Occupé attente (par exemple l'interrogation d'un dispositif).

time.sleep(0.0001) 

Ceci donnera lieu au planificateur de threads.

Aussi, je collectionnais des notes et des références dans http://homepage.mac.com/s_lott/iblog/architecture/C551260341/E20081031204203/index.html

+2

Je ne suis pas un expert, mais j'ai lu un peu sur le GIL. Pourriez-vous me donner un indice sur ce qui concerne en particulier cette question? Je vais utiliser 'time.sleep (epsilon)' pour l'instant, mais c'est insatisfaisant, n'est-ce pas? Il n'y a pas d'intervalle particulier pour lequel je veux dormir. –

+0

C'est la seule solution si votre matériel ne peut pas envoyer d'interruptions. – Unknown

+0

Sans utiliser 'time.sleep()' comment Python effectue-t-il un rendement préemptif? A quelles conditions un rendement se produit-il? – CMCDragonkai

3

Si vous faites cela sur * nix, vous trouverez peut-être la bibliothèque select utile. Kamaela a aussi quelques composants que vous pouvez trouver utiles, mais cela peut nécessiter un changement de paradigme.

Questions connexes