python多线程等待所有线程完成

新手上路,请多包涵

这可能是在类似的情况下被问到的,但在搜索了大约 20 分钟后我找不到答案,所以我会问。

我写了一个 Python 脚本(比方说:scriptA.py)和一个脚本(比方说 scriptB.py)

在 scriptB 中,我想用不同的参数多次调用 scriptA,每次运行大约需要一个小时,(它是一个巨大的脚本,做很多事情..不用担心)我希望能够运行scriptA 同时包含所有不同的参数,但我需要等到所有参数都完成后再继续;我的代码:

 import subprocess

#setup
do_setup()

#run scriptA
subprocess.call(scriptA + argumentsA)
subprocess.call(scriptA + argumentsB)
subprocess.call(scriptA + argumentsC)

#finish
do_finish()

我想同时运行所有 subprocess.call() ,然后等到它们全部完成,我该怎么做?

我试着像 这里 的例子一样使用线程:

 from threading import Thread
import subprocess

def call_script(args)
    subprocess.call(args)

#run scriptA
t1 = Thread(target=call_script, args=(scriptA + argumentsA))
t2 = Thread(target=call_script, args=(scriptA + argumentsB))
t3 = Thread(target=call_script, args=(scriptA + argumentsC))
t1.start()
t2.start()
t3.start()

但我认为这是不对的。

在转到我的 do_finish() 之前,我怎么知道它们都已完成运行?

原文由 Inbar Rose 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 460
2 个回答

您需要在脚本末尾使用 Thread 对象的 连接 方法。

 t1 = Thread(target=call_script, args=(scriptA + argumentsA))
t2 = Thread(target=call_script, args=(scriptA + argumentsB))
t3 = Thread(target=call_script, args=(scriptA + argumentsC))

t1.start()
t2.start()
t3.start()

t1.join()
t2.join()
t3.join()

因此主线程将等待 t1 , t2t3 完成执行。

原文由 Maksim Skurydzin 发布,翻译遵循 CC BY-SA 3.0 许可协议

将线程放在一个列表中,然后使用 Join 方法

 threads = []

 t = Thread(...)
 threads.append(t)

 ...repeat as often as necessary...

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

 # Wait for all of them to finish
 for x in threads:
     x.join()

原文由 Aaron Digulla 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题