【发布时间】:2010-10-27 10:42:03
【问题描述】:
我有一个 Python 脚本,我想将它用作另一个 Python 脚本的控制器。我有一个有 64 个处理器的服务器,所以想为第二个 Python 脚本生成多达 64 个子进程。子脚本被调用:
$ python create_graphs.py --name=NAME
其中 NAME 类似于 XYZ、ABC、NYU 等。
在我的父控制器脚本中,我从列表中检索名称变量:
my_list = [ 'XYZ', 'ABC', 'NYU' ]
所以我的问题是,将这些进程作为子进程生成的最佳方法是什么?我想一次将子进程的数量限制为 64,因此需要跟踪状态(如果子进程已完成或未完成),以便我可以有效地保持整代运行。
我研究过使用 subprocess 包,但拒绝了它,因为它一次只产生一个孩子。我终于找到了多处理器包,但我承认对整个线程与子进程的文档感到不知所措。
现在,我的脚本使用 subprocess.call 一次只生成一个孩子,如下所示:
#!/path/to/python
import subprocess, multiprocessing, Queue
from multiprocessing import Process
my_list = [ 'XYZ', 'ABC', 'NYU' ]
if __name__ == '__main__':
processors = multiprocessing.cpu_count()
for i in range(len(my_list)):
if( i < processors ):
cmd = ["python", "/path/to/create_graphs.py", "--name="+ my_list[i]]
child = subprocess.call( cmd, shell=False )
我真的希望它一次产生 64 个孩子。在其他 stackoverflow 问题中,我看到人们使用 Queue,但这似乎会影响性能?
【问题讨论】:
-
使用 enumerate 代替 range+len 组合
标签: python exec subprocess multiprocessing