我使用了很多os.system
次调用来在for循环中创建后台进程。我如何等待所有后台进程结束?
os.wait
告诉我没有子进程。
ps:我正在使用Solaris
这是我的代码:
#!/usr/bin/python
import subprocess
import os
pids = []
NB_PROC=30
for i in xrange(NB_PROC):
p = subprocess.Popen("(time wget http://site.com/test.php 2>&1 | grep real )&", shell=True)
pids.insert(0,p)
p = subprocess.Popen("(time wget http://site.com/test.php 2>&1 | grep real )&", shell=True)
pids.insert(0,p)
for i in xrange(NB_PROC*2):
pids[i].wait()
os.system("rm test.php*")
答案 0 :(得分:6)
通常,os.system()
在子进程完成时返回。所以os.wait()
确实没有什么可做的。它相当于subprocess.call()
。
使用subprocess.Popen()
创建后台进程,然后使用wait()
对象的poll()
或Popen
方法等待它们退出。
默认情况下,Popen不会生成shell但直接执行程序。这样可以节省资源并防止可能的shell注入攻击。
根据os.system()
的文档:
子进程模块为产卵提供了更强大的功能 新流程并检索其结果;使用该模块是 优于使用此功能
如果要并行执行多个作业,请考虑使用multiprocessing
,尤其是Pool
对象。它通过几个过程来处理农业工作的许多细节。
编辑:定时执行程序;
import time
import subprocess
t1 = time.clock()
t2 = time.clock()
overhead = t2-t1
t1 = time.clock()
subprocess.call(['wget', 'http://site.com/test.php'])
t2 = time.clock()
print 'elapsed time: {:.3f} seconds.'.format(t2-t1-overhead)
答案 1 :(得分:3)
解决方案确实在子进程模块中
#!/usr/bin/python
import subprocess
import os
pids = []
NB_PROC=4
cmd="(time wget http://site.com/test.php 2>&1 | grep elapsed | cut -d ' ' -f 3)"
for i in xrange(NB_PROC):
p = subprocess.Popen(cmd,stdin=None,stdout=None, shell=True)
pids.insert(0,p)
print "request %d processed" % (i+1)
for i in xrange(NB_PROC):
pids[i].wait()
os.system("rm test.php*")
在此过程中切换到debian但由于某些原因,有时候脚本会挂起,而有时它只是运行良好