2016-12-04 3 views
0
import threading 

в этой функции я хочу сделать мое кодирование материала для каждого потока, но только mainthread не входит эта функция ни одна из нити, которая была создана в основной функции входит в этой функцииПочему только MainThread достигает моей функции?

def enrich(): 
    for i in range(10): 
     print(threading.current_thread().getName()) 



def main(): 
    Thread_0 = threading.Thread(target=enrich()) 
    Thread_1 = threading.Thread(target=enrich()) 
    Thread_2 = threading.Thread(target=enrich()) 
    Thread_3 = threading.Thread(target=enrich()) 
    Thread_4 = threading.Thread(target=enrich()) 
    Thread_5 = threading.Thread(target=enrich()) 
    Thread_6 = threading.Thread(target=enrich()) 
    Thread_7 = threading.Thread(target=enrich()) 

    Thread_0.setName('0') 
    Thread_1.setName('1') 
    Thread_2.setName('2') 
    Thread_3.setName('3') 
    Thread_4.setName('4') 
    Thread_5.setName('5') 
    Thread_6.setName('6') 
    Thread_7.setName('7') 

    Thread_0.start() 
    Thread_1.start() 
    Thread_2.start() 
    Thread_3.start() 
    Thread_4.start() 
    Thread_5.start() 
    Thread_6.start() 
    Thread_7.start() 

    Thread_0.join() 
    Thread_1.join() 
    Thread_2.join() 
    Thread_3.join() 
    Thread_4.join() 
    Thread_5.join() 
    Thread_6.join() 
    Thread_7.join() 
    if __name__ == "__main__": main() 

в выходе я получаю это:

C:\Users\Danial\AppData\Local\Programs\Python\Python35\python.exe "D:/iaun/Final Project/FileTermsInfo/test.py" 
MainThread 
MainThread 
MainThread 
MainThread 
MainThread 
MainThread 
MainThread 
MainThread 

ответ

1

Это ваша проблема:

Thread_0 = threading.Thread(target=enrich()) 

Здесь вы находитесь , вызывая свою функцию enrich(), а не передавая ссылку на эту функцию в конструктор Thread. Естественно, это происходит в основном потоке, потому что пока нет других потоков. Функция возвращает None, поэтому вы фактически указываете target=None в конструкторе, и ни один из ваших потоков не получает ссылку на вызываемую функцию. В результате никто из них ничего не делает. Все вызовы до enrich() происходят до того, как создается только один поток, и они происходят последовательно, а не параллельно.

Передайте функцию, а не его результат:

Thread_0 = threading.Thread(target=enrich) 

А также для других потоков.

Кроме того, sheesh, используйте список, а не отдельные переменные для потоков. Для всего этого кода нет причин делать то, что вы могли бы сделать в нескольких строках.

threads = [threading.Thread(target=enrich, name=str(x)) for x in range(8)] 
for thread in threads: 
    thread.start() 
for thread in threads: 
    thread.join() 
+0

спасибо Kindall Я хочу быть уверен, что я делаю Everythings право, поэтому я не использовал список – danitiger33

+0

, что о ситуации, когда я хочу передать некоторые переменные в качестве входных данных для функции? – danitiger33

+0

Это аргумент 'args' конструктора. Или в некоторых случаях было бы удобнее использовать лямбда или 'functools.partial'. – kindall

 Смежные вопросы

  • Нет связанных вопросов^_^