【问题标题】:Wait for child using os.system等待孩子使用 os.system
【发布时间】:2012-08-22 09:03:46
【问题描述】:

我使用大量的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 已弃用,尝试使用subprocess 模块
  • os.system 似乎没有被弃用:docs.python.org/library/os.html 但即使使用子进程我也有同样的错误

标签: python shell os.system


【解决方案1】:

通常,os.system() 在子进程完成时返回。所以os.wait() 确实无事可做。相当于subprocess.call()

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

默认情况下,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)

【讨论】:

  • @maazza 带有os.system 的Python 脚本等待shell 终止。由于 shell 命令以 & 结尾,因此 shell 在启动管道后立即终止,无需等待它终止。
  • 真的!但是子进程呢?你认为它有同样的问题吗?
  • @maazza 这不是问题,它只是按照您的指示行事。你想完成什么?如果您想计时命令的执行,只需在两个 time.clock() 调用之间使用 subprocess.call()
  • 不,它必须是对 Web 服务器的并发请求,time.clock 没有帮助
  • 那么你想做什么?对网络服务器进行压力测试?在这种情况下,我建议您查看 requests 模块 (docs.python-requests.org/en/latest/index.html)。要并行化,请使用例如来自multiprocessing.Poolmap() 方法。这样,您甚至可以测试多个 URL,而不仅仅是一个。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-11-30
    • 2021-04-28
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多