Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python分叉进程获胜';别死_Python - Fatal编程技术网

Python分叉进程获胜';别死

Python分叉进程获胜';别死,python,Python,我见过几个像这样的问题,但是在尝试了各种检查孩子是否还活着并退出孩子进程的方法之后,我简化了这个问题,但仍然不起作用 使用sys.exit(0)退出分叉进程是否有误? 有没有别的办法杀死它。问题是,我不能让父进程终止进程,因为它不知道进程何时完成工作 起初我认为这是因为a在退出()之前执行了一个系统命令,但我甚至在简化版本中删除了它,因为给定的解决方案也不起作用 下面是一个例子: import sys import os import time children = [] for i in

我见过几个像这样的问题,但是在尝试了各种检查孩子是否还活着并退出孩子进程的方法之后,我简化了这个问题,但仍然不起作用

使用sys.exit(0)退出分叉进程是否有误? 有没有别的办法杀死它。问题是,我不能让父进程终止进程,因为它不知道进程何时完成工作

起初我认为这是因为a在退出()之前执行了一个系统命令,但我甚至在简化版本中删除了它,因为给定的解决方案也不起作用

下面是一个例子:

import sys
import os
import time

children = []

for i in range(0,3):    
    pid = os.fork()

    if pid == -1:
        continue
    elif pid == 0:
        # Do work...
        print 'Child %d spawned' % os.getpid()
        sys.exit(0)     
    else:
        children.append(pid)

time.sleep(5)
for pid in children:
    proc_path = '/proc/%d' % pid
    if not os.path.exists(proc_path):
        print 'Child %d is dead' % pid
    else:
        print 'Child %d is alive' % pid
这张照片是:

Child 27636 spawned
Child 27637 spawned
Child 27638 spawned
Child 27636 is alive
Child 27637 is alive
Child 27638 is alive
但子进程应该是死的

在这种情况下,是什么导致这些进程变成僵尸?

您必须等待()子进程

请添加以下行以更正问题:

import sys
import os
import time

children = []

for i in range(0,3):    
    pid = os.fork()

    if pid == -1:
        continue
    elif pid == 0:
        # Do work...
        print 'Child %d spawned' % os.getpid()
        sys.exit(0)     
    else:
        children.append(pid)

time.sleep(5)

# ADD NEXT TWO LINES:
for pid in children:
    os.waitpid(pid, 0)

for pid in children:
    proc_path = '/proc/%d' % pid
    if not os.path.exists(proc_path):
        print 'Child %d is dead' % pid
    else:
        print 'Child %d is alive' % pid
对于子级,父级必须
wait()
。有关详细信息,请参见
man 2 wait


在python中,您可以使用
子流程
模块来处理这些事情。

要使子进程从PID表中消失,您需要在父进程一侧使用
wait()

n_still_children_alive = len(children)
while n_still_children_alive > 0:
    pid, status = os.wait()
    print "Child %d died and joined" % pid
    n_still_children_alive -= 1

如果您想在Python中使用多处理,最好使用
os
module

谢谢。我通常使用多处理,这就是为什么我从来没有遇到过这个问题。但现在我仍坚持使用python 2.5。谢谢。这是可行的,我需要补充一些逻辑,但没关系。