主要是 Popen 貌似有点问题,我是这样写的:
glps = list(filter(lambda x:'.glp' in x, os.listdir(rootpath+'outputs/')))
num_threads = len(glps)
cmd_list = [['python', 'lithosim_one.py', 'evaluation/lithosim%d/'%i, rootpath+'outputs/'+glps[i]] for i in range(num_threads)]
proc_list = [Popen(cmd, stdout=PIPE, stderr=PIPE) for cmd in cmd_list]
for p in proc_list:
p.wait()
假如有 10 个文件要仿真,我的机器是 6 核,它会把 6 个仿完,剩下的 4 个就不继续了,主程序也没有结束。
————————————————————————————————————
百度找到问题了:
使用 subprocess 模块的 Popen 调用外部程序,如果 stdout 或 stderr 参数是 pipe,并且程序输出超过操作系统的 pipe size时,如果使用 Popen.wait() 方式等待程序结束获取返回值,会导致死锁,程序卡在 wait() 调用上。
解决方法:把wait()
改成communicate()
就可以了。
1
no1xsyzy 2019-03-28 15:45:44 +08:00
subprocess 了为什么要好多个终端?直接 Popen 一堆就行了。
|
2
dysxjyy OP @no1xsyzy
主要是 Popen 貌似有点问题,我是这样写的: ``` python glps = list(filter(lambda x:'.glp' in x, os.listdir(rootpath+'outputs/'))) num_threads = len(glps) cmd_list = [['python', 'lithosim_one.py', 'evaluation/lithosim%d/'%i, rootpath+'outputs/'+glps[i]] for i in range(num_threads)] proc_list = [Popen(cmd, stdout=PIPE, stderr=PIPE) for cmd in cmd_list] for p in proc_list: p.wait() ``` 假如有 10 个文件要仿真,我的机器是 6 核,它会把 6 个仿完,剩下的 4 个就不继续了,主程序也没有结束。 |
3
www5070504 2019-03-28 18:16:45 +08:00
@dysxjyy 用线程行不 解释器锁会切换线程的
|
4
haddy 2019-03-28 18:27:10 +08:00
|
5
dysxjyy OP |