我没有软件背景,请原谅任何不正确的术语。
我想在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
打开的新流程可能不会终止或关闭?
非常感谢!
答案 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
获取退出状态,您将释放您的僵尸孩子。