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 ..
Die ausführbare Datei verweist dynamisch auf libpthread. –