2010-07-01 17 views
5

Beim Experimentieren mit der C-API von Python (python.org) habe ich mich gefragt, wie man Threads über Pythons threading-Paket korrekt spawnt, wenn Python selbst in ein C-Programm eingebettet ist. Die Funktionen PyEval_EvalCode und kin scheinen Threads zu beenden, die sie "besitzt", sobald die C-Funktion die Auswertung eines Blocks aus Python-Code abgeschlossen hat. Grob gesagt, das folgende Python aus C läuft ...Python-Threads in eingebettetem Python: Wie?

import threading, time 

class MyThread(threading.Thread): 
    def __init__(self, num): 
     self.num = num 
     threading.Thread.__init__(self) 
    def run(self): 
     print "magic num = %d" % self.num 

for x in xrange(1000): 
    MyThread(x).start() 

... vollständig stoppt, sobald die für die Schleife beendet und die Steuerung kehrt wieder aus dem PyEval_EvalCode (oder einer) C Funktion. Wir können beobachten, dass dies zu abgeschnittenen Ausgaben führt.

Hypothese ich dieses Verhaltens nach der folgenden Taktik: Wir können diktieren, wenn die Steuerung zurückgeführt wird, und somit zu einem gewissen Grad des Ausgang, durch Schlafen, nachdem die ganze Reihe von Themen Laichen:

for x in xrange(100): 
    MyThread(x).start() 

# Don't leave just yet; let threads run for a bit 
time.sleep(5) # Adjust to taste 

ich einen möglichen vermuten Ansatz besteht darin, einen neuen Systemthread zu erstellen, der Python einbetten und ausführen soll. Nach dem Erzeugen von Python-Threads würde der Python-Code auf einem Semaphor oder etwas schlafen, bis es angewiesen wird, herunterzufahren. Die Frage wäre dann, wie kann der Thread für eine ordentliche Abschaltung signalisiert werden? In ähnlicher Weise kann der "Haupt" -Block einfach() an allen Threads verbinden; die Fäden müssten dann

Lösungen sehr geschätzt von C. signalisiert werden ..

Antwort

1

Haben Sie die pthread-Bibliothek enthalten? Python wird auf Dummy-Threads zurückgreifen, wenn es erkennt, dass echte Threads nicht verfügbar sind.

+0

Die ausführbare Datei verweist dynamisch auf libpthread. –

Verwandte Themen