2009-04-24 4 views
36

Ich habe einen Thread, der ein Stück Hardware abfragt.Wie führt ein threading.Thread in Python zum Rest seines Quantums?

Aber es gibt andere Threads (und Prozesse!), Die Dinge zu tun haben könnten. Wenn das der Fall ist, möchte ich keine CPU brennen, um die Hardware bei jeder anderen Anweisung zu überprüfen. Es ist eine Weile her, seit ich mich mit Threading beschäftigt habe, und als ich es tat, war es nicht Python, aber ich glaube, die meisten Threading-Bibliotheken haben eine yield Funktion oder etwas, das einem Thread den Scheduler sagt "Gib den anderen Threads eine Chance. "

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

Aber ich kann keinen Hinweis auf so etwas wie dies in der Threading-Dokumentation. Python hat eine yield Anweisung, aber ich bin mir ziemlich sicher, dass das etwas ganz anderes ist (mit Generatoren zu tun).

Was ist hier richtig?

Antwort

55

time.sleep(0) ist ausreichend, um Kontrolle zu geben - keine Notwendigkeit, ein positives Epsilon zu verwenden. In der Tat, time.sleep(0) bedeutet "Ausbeute, was auch immer andere Thread bereit sein kann".

+4

Ist das irgendwo dokumentiert? Ich dachte, das könnte wahr sein - ich habe es in anderen Sprachen gesehen - aber ich konnte es in den Python-Dokumenten nicht finden. –

+3

zum Beispiel, http://docs.python.org/library/sched.html "delayfunc wird auch mit dem Argument 0 aufgerufen, nachdem jedes Ereignis ausgeführt wurde, um anderen Threads die Möglichkeit zu geben, in Multithread-Anwendungen ausgeführt zu werden." (delayfunc ist normalerweise time.sleep hier). Ich stimme zu, es wäre schöner, wenn es direkt in der Modulzeit dokumentiert wäre ;-) –

+1

Gut versteckt! Vielen Dank! –

11

Lesen Sie den Global Interpreter Lock (GIL).

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

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

dies im Code tun, wenn Sie Busy Waiting (z Polling ein Gerät) zu tun haben.

time.sleep(0.0001) 

Dies wird zum Thread-Scheduler führen.

Auch ich in http://homepage.mac.com/s_lott/iblog/architecture/C551260341/E20081031204203/index.html

+2

Ich bin kein Experte, aber ich habe ein bisschen über die GIL gelesen. Könnten Sie mir einen Hinweis geben, was genau diese Frage betrifft? Ich werde mit 'time.sleep (epsilon)' für jetzt gehen, aber es ist irgendwie unbefriedigend, nicht wahr? Es gibt kein bestimmtes Intervall, für das ich schlafen möchte. –

+0

Es ist die einzige Lösung, wenn Ihre Hardware keine Interrupts senden kann. – Unknown

+0

Ohne 'time.sleep()' zu verwenden, wie führt Python vorbeugendes Nachgeben durch? Unter welchen Bedingungen tritt ein Ertrag auf? – CMCDragonkai

3

ein paar Notizen und Referenzen gesammelt Wenn Sie diese nichts auf * tun, könnten Sie die select Bibliothek nützlich finden. Kamaela hat auch ein paar Komponenten, die Sie vielleicht nützlich finden, aber es kann ein bisschen ein Paradigmenwechsel erfordern.

Verwandte Themen