2015-07-08 2 views
1

Я использую threading в python, чтобы динамически генерировать несколько потоков. Это как я нерест нити:как ждать динамического запуска нескольких потоков в python до конца

def func(max_val): 

    for val in range(0,max_val): 
     thread1 = threading.Thread(target=func9, args=(val,)) 
     thread1.start() 

    print 'Ended all threads' #this should get printed once all the threads have ended 
    # bunch of other code after this 
    . 
    . 
    . 


if __name__ == '__main__': 
    ret = func() 

То, что я хочу, что когда-то все нити были порождал то процесс должен ждать, пока все нити закончились, а затем приступить к следующей строке кода. Я знаю, что мы используем thread1.join(), чтобы дождаться потока, но если я поместил его внутри цикла for, он будет ждать окончания 1-го потока до того, как будет создан следующий поток. Я не хочу, чтобы он дождался окончания одного потока до начала следующего потока. Он должен порождать все потоки одновременно, а затем ждать, пока все они закончится до выполнения следующей строки кода (например, print в func() выше должен быть выполнен после завершения всех потоков).

Как это сделать?

ответ

3

Почему бы вам не оставить их в списке?

threads = [] 

for val in range(0,max_val): 
    thread1 = threading.Thread(target=func9, args=(val,)) 
    thread1.start() 
    threads.append(thread1) 

for thread in threads: 
    thread.join() 
+0

Вы не должны проверять если 'thread' является« текущей нитью », чтобы избежать ситуации« тупика »? –

+0

@ KhalilAmmour- خليلعمور, о каком тупике вы упоминаете? –

+0

Из Python Docs: > join() вызывает RuntimeError, если делается попытка присоединиться к текущему потоку, так как это вызовет тупик. –

1

Ссылаясь на Python Docs:

присоединиться() вызывает RuntimeError, если предпринимается попытка присоединиться к текущей нить, как бы привести к тупиковой ситуации. Также возникает ошибка в соединении() с потоком до того, как он был запущен, и попытки сделать это приводит к тому же исключению .

Вы можете сделать это таким образом, даже не сохраняя их в список (пример взят из here):

main_thread = threading.currentThread() 
for t in threading.enumerate(): 
    if t is main_thread: 
     continue 
    t.join() 

enumerate() возвращает список активных экземпляров темы

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