2010-07-01 13 views
5

Durante la sperimentazione con l'API C Python (python.org), mi sono trovato a chiedermi come generare i thread correttamente tramite il pacchetto threading di Python quando Python stesso è incorporato in un programma C. Le funzioni PyEval_EvalCode e parenti sembrano terminare i thread che "possiede" non appena la funzione C termina di valutare un blocco di codice Python. Approssimativamente, eseguendo il seguente Python da C ...Thread Python in Python incorporato: come?

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() 

... si fermerà completamente non appena i per finiture e controllo ad anello viene restituito indietro del PyEval_EvalCode (o) funzione C. Possiamo osservare che questo produce output troncato.

ho ipotizzato questo comportamento dopo aver utilizzato il seguente tattica: Possiamo dettare quando si restituisce il controllo, e quindi in misura all'uscita, dormendo dopo deposizione del gran numero di fili:

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 

Sospetto un possibile approccio sta nella creazione di un nuovo thread di sistema dedicato all'inclusione e all'esecuzione di Python. Dopo aver generato i thread Python, il codice Python si fermava su un semaforo o qualcosa del genere fino a quando non veniva detto di spegnersi. La domanda sarebbe quindi come può essere segnalato il thread per un arresto ordinato? Allo stesso modo, il blocco "principale" può semplicemente join() su tutti i thread; i fili avrebbero quindi bisogno di essere segnalato da C.

soluzioni molto apprezzate ..

risposta

1

È stato incluso la libreria pthread? Python ritornerà ai thread fittizi se rileva che i thread reali non sono disponibili

+0

L'eseguibile si collega dinamicamente a libpthread. –