这可能是在类似的背景下提出的,但是在搜索约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()
,然后等到它们全部完成,我该怎么做?
我试图像示例here一样使用线程:
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()
之前,我如何知道他们已经完成了所有运行?
8 回答
将线程放在列表中,然后使用Join method
我更喜欢使用基于输入列表的列表推导:
您需要在脚本的末尾使用
Thread
对象的join方法 .因此主线程将等到
t1
,t2
和t3
完成执行 .在Python3中,由于Python 3.2有一种新的方法可以达到相同的结果,我个人更喜欢传统的线程创建/启动/加入,包
concurrent.futures
:https://docs.python.org/3/library/concurrent.futures.html使用
ThreadPoolExecutor
代码将是:其中一个优点是您可以控制吞吐量设置最大并发工作者 .
您可以使用类似下面的类,您可以在其中添加'n'个函数或者您想要以并行激情执行的console_scripts并开始执行并等待所有作业完成 .
也许,像
我刚遇到同样的问题,我需要等待使用for循环创建的所有线程 . 我只是尝试了下面的代码 . 它可能不是完美的解决方案,但我认为这将是一个简单的解决方案去测试:
来自
threading
module documentation因此,当您不想保留您创建的线程列表时,要捕获这两种情况:
于是: