2016-03-18 18 views
7

Próbuję obrócić głowę. W moim kodzie, wystrzeliwuje tylko jeden wątek, kiedy myślę, że powinien przejść od razu do drugiego. Czytałem już o zamkach i przydziałach, ale nie do końca rozumiem. Co powinienem zrobić, aby dwa wątki działały niezależnie w tym samym czasie?Zrozumienie gwintowania

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

Musisz pokazać rzeczywiste i oczekiwane wyjście dla nikogo, aby móc odpowiedzieć na to pytanie. –

Odpowiedz

5

Masz nieprawidłowy podpis pod adresem start_new_thread. Dzwonisz pod numer myproc i przekazujesz wynik jako argument do start_new_thread, który nigdy się nie kończy jako myproc nigdy się nie kończy.

Zamiast tego powinno być:

thread.start_new_thread(myproc, (thing,)) 

Pierwszym argumentem jest funkcja (czyli obiekt funkcji, a nie wywołanie funkcji.), A drugi jest krotki argumentów.

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

Gdy masz program faktycznie rozpoczynając oba wątki, prawdopodobnie chcesz dodać pauzę na końcu ponieważ gwinty wygasa, gdy główny wykończeń wątku.

Należy również rozważyć użycie modułu threading zamiast modułu thread, ponieważ zapewnia on znacznie lepszy interfejs wyższego poziomu, na przykład wygodną metodę oczekiwania na zakończenie wykonywania wątków.

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

+1

Skrypt również kończy działanie, zanim wątki będą miały możliwość wydrukowania czegokolwiek. –

+0

Oryginalny skrypt w pytaniu nie - nie dotarł tak daleko, jak uruchomienie wątków. Ale tak, to jest problem, gdy rozwiązujesz pierwotny problem. – SpoonMeiser

+0

Brilliant - to ma sens! – user4893295

2

Twoja aplikacja kończy pracę, zanim drugi wątek zdąży się zakończyć, z tego, co mogę powiedzieć.

Trzeba czekać na obu swoich wątków skończyć zanim aplikacja kończy się w następujący sposób:

#!/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 

Należy preferrably przechowywania przedmiotów nici i używać thread1.join() i thread2.join() na końcu przed wyjściem, aby zasygnalizować, że oboje zakończyli.

+0

To też jest przydatne - w jaki sposób chciałbym przechowywać wątki, gdy są tworzone w pętli? Musiałbym jakoś wstawić zmienną "rzecz" do nazwy instancji? – user4893295

+0

@ user4893295 Zobacz tę stronę http://www.tutorialspoint.com/python/python_multithreading.htm pod "Tworzenie wątku za pomocą modułu wątków", aby dowiedzieć się, jak przechowywać obiekt wątku! – Zolomon