如何在python中等待动态启动多个线程来完成

时间:2015-07-08 22:47:56

标签: python multithreading python-multithreading

我在python中使用threading动态生成多个线程。这就是我如何产生线程:

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循环中,那么它将等待第一个线程结束,然后产生下一个线程。我不希望它在开始下一个线程之前等待一个线程结束。它应该同时生成所有线程,然后在代码中执行下一行之前等待所有线程结束(就像上面print中的func()应该在所有线程结束后执行一样)。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

为什么不把它们列入清单?

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

答案 1 :(得分:1)

参考Python Docs

  如果尝试加入当前,

join()会引发RuntimeError   线程会导致死锁。加入()a也是一个错误   线程在它启动之前尝试这样做会引发   同样的例外。

你可以这样做,甚至不用将它们保存到列表中(取自here的例子):

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

enumerate()返回活动线程实例列表