Python 使用操作系统等待子系统

Python 使用操作系统等待子系统,python,shell,os.system,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>

我使用大量的
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*")
通常,当子进程完成时,
os.system()
返回。因此,
os.wait()
确实无事可做。它相当于
subprocess.call()

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

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

根据
os.system()
的文档:

子流程模块为繁殖提供了更强大的工具 新流程和检索其结果;使用该模块是非常困难的 比使用此函数更好

如果要并行执行多个作业,请考虑使用<代码>多重处理< />代码,尤其是<代码>池< /COD>对象。它通过几个过程处理农业生产的许多细节

编辑:为程序的执行计时

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)

解决方案确实在子流程模块中

#!/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,但由于某些原因,有时脚本挂起,有时运行正常。系统不推荐使用,尝试使用
subprocess
moduleos.system似乎没有被弃用:但即使使用subprocess,我也有相同的功能error@maazza带有
os.system
的Python脚本等待shell终止。由于shell命令以
&
结尾,因此shell在启动管道后立即终止,而不等待它终止。true!但子流程呢?你认为它也有同样的问题吗?@maazza这不是问题,它只是按照你告诉它的去做。你想做什么?如果您想为命令的执行计时,只需在两次调用之间使用
subprocess.call()
。time.clock()即可。不,它需要是对web服务器的并发请求,time.clock没有帮助。那么您想做什么?对web服务器进行压力测试?在这种情况下,我建议您查看requests模块()。要并行化,请使用
multiprocessing.Pool
中的
map()
方法。有了它,您甚至可以测试多个URL,而不仅仅是一个。