我设法创建了一个池,限制它一次只运行2个进程。
process_pool = Pool(2)
commands = []
for (dirpath, dir, file) in os.walk("files"):
for name in file:
command = "python process.py {0}".format(name)
commands.append(command)
for i, returncode in enumerate(process_pool.imap(partial(call, shell=False), commands)):
if returncode != 0:
print("command {0} failed".format(i))
def check_limit():
pgrep = subprocess.Popen("pgrep subprocess".split(), stdout=subprocess.PIPE, shell=False)
wc = subprocess.Popen("wc -l".split(), stdin=pgrep.stdout, stdout=subprocess.PIPE, shell=False)
return wc.communicate()[0]
这一切都是自动完成的,当流程终止时,新的流程就会在他的位置启动。有没有办法手动控制它们?
处理二进制文件最多可生成20个子进程,每个进程限制350MB RAM,每台机器限制60个子进程。当所有子进程终止时,父进程终止,然后池启动另一个父进程 - 在这种情况下,这不是最佳解决方案。由于子进程是异步的,其中一些可能会早于其他进程终止,我想启动另一个父进程,以便它可以开始生成新的子进程。 它可能看起来像这样。
start process
if subprocesses < 60
start process
else
wait 10 secs
这是在bash中完成的事情。
for i in `ls -1 $PATH/*xml`; do
COMMAND="${BINPATH} ${i}"
if [ $BACKGROUND -eq 1 ]; then
check_limit
$COMMAND >> $LogFile 2>&1 &
PIDLIST="$! ${PIDLIST}"
done
pwait ${PIDLIST} >& /dev/null
是否有任何方法可以实现这一点,也许Pool不是最好的解决方案,我应该使用Queue?
答案 0 :(得分:0)
堆栈溢出有时像橡皮鸭一样,在等待帮助时我自己解决了这个问题。只需删除等待subprocess.Popen结果并将其包含在while循环中
command_counter = 0
while True:
file = open(INPUT_FILE)
if check_child_processes() < 60 and command_counter < len(commands_list):
subprocess.Popen(commands_list[command_counter].split(), shell=False, stdin=file)
command_counter += 1
time.sleep(1)
if check_parent_processes() == 0:
break
无论如何,谢谢你的帮助。