2016-03-18 23 views
7

Provare a farmi girare la testa. Nel mio codice, spara solo un thread, quando penso che dovrebbe andare dritto al secondo. Ho letto di serrature e allocazioni ma non capisco. Cosa dovrei fare qui per far funzionare 2 thread contemporaneamente allo stesso tempo?Informazioni sulla filettatura

import thread 

def myproc(item): 
    print("Thread fired for " + item) 
    while True: 
     pass 

things = ['thingone', 'thingtwo'] 

for thing in things: 
    try: 
     thread.start_new_thread(myproc(thing)) 

    except: 
     print("Error") 
+0

Avrai bisogno di mostrare l'uscita effettiva e attesa per chiunque di essere in grado di rispondere alla tua domanda. –

risposta

5

Hai la firma su start_new_thread errata. Stai chiamando myproc e passando il risultato come argomento a start_new_thread, che non accade mai come myproc non termina mai.

Invece, dovrebbe essere:

thread.start_new_thread(myproc, (thing,)) 

Il primo argomento è la funzione (ossia l'oggetto funzione, non chiamando la funzione.) E la seconda è una tupla di argomenti.

See: https://docs.python.org/2/library/thread.html#thread.start_new_thread

Una volta che avete il vostro programma di iniziare effettivamente entrambi i fili, probabilmente si desidera aggiungere una pausa alla fine perché i fili terminerà quando le principali finiture filo.

Inoltre, si consiglia di utilizzare il modulo threading anziché il modulo thread, in quanto fornisce un'interfaccia di livello superiore molto più interessante, ad esempio un modo conveniente per attendere il completamento dell'esecuzione dei thread.

See: https://docs.python.org/2/library/threading.html#module-threading

+1

Anche lo script si chiude prima che i thread abbiano l'opportunità di stampare qualcosa –

+0

Lo script originale nella domanda non ha funzionato - non è arrivato fino all'avvio dei thread. Ma sì, è una preoccupazione quando si risolve il problema originale. – SpoonMeiser

+0

Brillante: questo ha senso! – user4893295

2

L'applicazione si interrompe prima che il secondo thread abbia avuto il tempo di terminare, da quello che posso dire.

è necessario attendere per entrambi i thread per finire prima che l'applicazione termina, in questo modo:

#!/usr/bin/python 

import thread 
import time 

# Define a function for the thread 
def print_time(threadName, delay): 
    count = 0 
    while count < 5: 
     time.sleep(delay) 
     count += 1 
     print "%s: %s" % (threadName, time.ctime(time.time())) 

# Create two threads as follows 
try: 
    thread.start_new_thread(print_time, ("Thread-1", 2,)) 
    thread.start_new_thread(print_time, ("Thread-2", 4,)) 
except: 
    print "Error: unable to start thread" 

while 1: # This is a bad solution due to the busy wait loop. More below. 
    pass 

Si dovrebbe preferibilmente memorizzare gli oggetti thread e utilizzare thread1.join() e thread2.join() alla fine prima di uscire per segnalare che hanno entrambi terminato.

+0

Anche questo è utile: come faccio a memorizzare i thread quando vengono creati in un loop? Avrei bisogno di ottenere la variabile 'cosa' nel nome dell'istanza in qualche modo? – user4893295

+0

@ user4893295 Vedere questa pagina http://www.tutorialspoint.com/python/python_multithreading.htm in "Creazione di thread utilizzando il modulo di threading" per informazioni su come memorizzare un oggetto thread! – Zolomon

Problemi correlati