计算python中子进程/子进程的数量

时间:2018-02-22 02:33:09

标签: python bash macos

我没有软件背景,请原谅任何不正确的术语。

我想在python脚本中创建一个循环,监视创建的子进程数。下面是python中代码的示例:

for x in list:
   os.system('program --input %s &' % (x))
   while int(subprocess.check_output("echo $(pgrep -c -P$$)", shell=True)) > n-1:
        time.sleep(0.25)

这里的目的是同时运行多个作业(有10,000个<),而不会使系统过载。作业在后台运行,当正在运行的作业数量低于某个数字(n-1)时,下一个作业开始。

上面的代码在ubuntu中运行.py脚本时有效,但由于缺少pgrep的-c选项而无法在macOS中运行。

使用以下内容:

subprocess.check_output("pgrep -P$$ | wc -l", shell=True)

...在mac终端中有效,但无法使用 os.system()从python中返回正确的值。通过开放的python控制台运行代码或将其作为脚本执行时会有区别吗?

是否有更好的(可能更加pythonic)或更聪明的方式来编写代码以允许此循环在macOS 上运行而不必必须安装不同版本的pgrep?也许使用 psutil 模块或通过某种 popen 函数在其自己的子线程中运行程序,使它们更容易监控?

非常感谢!

编辑:
改进后的代码:

import subprocess 
import psutil
import time

def childCount():
    current_process = psutil.Process()
    children = current_process.children()
    return(len(children))

for x in range(1,11):
    subprocess.Popen(['sleep 2'], shell=True)
    print('running %s' % (str(x)))
    while childCount() > 4:
        time.sleep(0.25)

但是,现在问题是脚本在第5次迭代时挂起。当孩子(在这种情况下为subprocess.Popen)完成运行时,sleep打开的新流程可能不会终止或关闭?

非常感谢!

1 个答案:

答案 0 :(得分:1)

你所拥有的是来自父进程的一堆僵尸子进程(即subprocess调用)在终止之前没有等待退出状态。

import subprocess 
import psutil
import time

def childCount():
    current_process = psutil.Process()
    children = current_process.children()
    return(len(children))

for x in range(1,11):
    p = subprocess.Popen(['sleep 2'], shell=True) # save the Popen instance
    print('running %s' % (str(x)))
    while childCount() > 4:
        time.sleep(0.25)
        p.communicate() # this will get the exit code

通过Popen.communicate获取退出状态,您将释放您的僵尸孩子。