2

我使用大量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*")
4

2 回答 2

6

通常,os.system()当子进程完成时返回。所以确实没有什么os.wait()可做的。它相当于subprocess.call()

用于subprocess.Popen()创建后台进程,然后对象的wait()orpoll()方法Popen等待它们退出。

默认情况下,Popen 不会生成 shell,而是直接执行程序。这可以节省资源并防止可能的 shell 注入攻击。

根据以下文档os.system()

subprocess 模块提供了更强大的工具来生成新进程并检索它们的结果;使用该模块优于使用此功能

如果您想并行执行多个作业,请考虑使用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)
于 2012-08-22T10:21:28.487 回答
3

解决方案确实在 subprocess 模块中

#!/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,但由于某种原因,有时脚本会挂起,而有时它运行良好

于 2012-08-26T16:16:39.920 回答