![](/img/trans.png)
[英]Python, multiple scripts, each with multiple threads running, how can one script determine when threads in other scripts are finished?
[英]How to use python script to start other python scripts and check whether all “child scripts” are finished?
基本上,我想使用一个脚本在不同目录中启动其他脚本,并进行后续工作,直到完成所有“子脚本”。 我使用multiprocessing.Pool将所有子进程放在一起,并使用wait()等待所有操作完成。 这是我的脚本:
import os, shutil, subprocess,sys, multiprocessing
rootdir=os.getcwd()
argument=[]
def Openpy(inputinfo):
dirpath, filename= inputinfo
os.chdir(dirpath)
return subprocess.Popen( [ 'python', filename ] )
if __name__=="__main__":
for dirpath, dirname , filenames in os.walk(rootdir):
for filename in filenames:
if filename=='Test.py':
argument.append( [ dirpath, filename ] )
print argument
po=multiprocessing.Pool()
r=po.map_async(Openpy, argument)
po.close()
r.wait()
print 'Child scripts are finished'
子进程正常启动,并在一分钟内完成。 但是,这些子进程似乎没有将其“完成的消息”返回给父进程。 它没有显示“子脚本已完成”。 我该怎么做才能更改代码,以便它可以正确检测到子进程的结束?
感谢所有帮助!
2013/9/1 9:16 UTC + 8
塞巴斯蒂安·JF的答案被接受。 成功运行,优雅地使用列表理解使整个内容更具可读性。
尝试交换r.wait()和po.close()的位置
if __name__=="__main__":
for dirpath, dirname , filenames in os.walk(rootdir):
for filename in filenames:
if filename=='Test.py':
argument.append( [ dirpath, filename ] )
print argument
po=multiprocessing.Pool()
r=po.map_async(Openpy, argument)
r.wait()
po.close()
可能不是您的问题,但看起来您可能正在关闭池,然后才评估结果。
Popen()
立即返回,因此您的父进程在子脚本之前就完成了很长时间,即,在输出的开始处查找“完成的消息”。
您不需要multiprocessing
即可同时运行子流程:
import os
import sys
from subprocess import Popen
# run all child scripts in parallel
processes = [Popen([sys.executable, filename], cwd=dirpath)
for dirpath, dirname , filenames in os.walk('.')
for filename in filenames
if filename == 'Test.py']
# wait until they finish
for p in processes:
p.wait()
print("all done")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.