所以我有一个线程列表,全部启动(使用threading.start()
),我必须阻止主线程完成列表中的所有线程。
这可以通过以下方式实现:
[x.join() for x in threads]
但是,对于每个执行的x.join()
,所有其他线程也会被阻止。我想要的是所有线程彼此并行执行。只有当所有线程都被执行时,主程序才应该恢复,并且列表中的任何线程都不应该被阻止。
据我所知,我想要的是连接方法不会发生,或者我错了?
答案 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!
您可以看到它可以根据您的需要使用。