等待使用os.system的孩子

时间:2012-08-22 09:03:46

标签: python shell os.system

我使用了很多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*")

2 个答案:

答案 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但由于某些原因,有时候脚本会挂起,而有时它只是运行良好