使主线程等待直到所有线程完成

时间:2014-08-12 07:03:56

标签: python multithreading python-2.7

所以我有一个线程列表,全部启动(使用threading.start()),我必须阻止主线程完成列表中的所有线程。

这可以通过以下方式实现:

[x.join() for x in threads]

但是,对于每个执行的x.join(),所有其他线程也会被阻止。我想要的是所有线程彼此并行执行。只有当所有线程都被执行时,主程序才应该恢复,并且列表中的任何线程都不应该被阻止。

据我所知,我想要的是连接方法不会发生,或者我错了?

2 个答案:

答案 0 :(得分:6)

不,x.join()仅阻止主线程。其他线程继续并行执行。

for thread in threads:
    thread.join()

有些更惯用,因为你实际上并没有建立一个列表。

您还应该知道multithreading doesn't work as expected in Python,除非您正在进行IO限制的工作(即多次点击远程服务),否则您不太可能从中获得任何性能提升。

答案 1 :(得分:1)

以下是一个例子:

from threading import Thread, Lock
from time import sleep
from random import random

def target(i, lock):
    with lock:
        print("Starting thread {}".format(i))
    # Do something
    sleep(random()*5)
    with lock:
        print("Stopping thread {}".format(i))

# Create the threads
lock = Lock()
threads = [Thread(target=target, args=(i, lock)) for i in range(5)]

# Start the threads
for x in threads:
    x.start()

# Stop the threads
for x in threads:
    x.join()

print("Done!")

这是一个可能的输出:

>>>
Starting thread 0
Starting thread 1
Starting thread 2
Starting thread 3
Starting thread 4
Stopping thread 1
Stopping thread 4
Stopping thread 0
Stopping thread 2
Stopping thread 3
Done!

您可以看到它可以根据您的需要使用。