有时forked_pid永远不会返回0

时间:2019-03-17 18:19:10

标签: python python-multiprocessing

import os

parent_pid = os.getpid()
print "[parent] starts PID: %d" % (parent_pid, )

forked_pid = os.fork()
if forked_pid == 0:
    print "[child] child process can't use os.fork() PID, since it's %d" % (forked_pid, )
    print "[child] but it can reevaluate os.getpid() to get it's own PID: %d" % (os.getpid(), )
else:
    print "[parent] parent process have created child with PID: %d" % (forked_pid, )

output

如果我不在第6行(forked_pid = os.fork())处设置断点-我从子进程中获取日志,但是如果我进行调试-forked_pid永远不会等于0。

原因,我开始研究这个问题。

p = Process(target=self.run_threaded_io, args=(additional_threads,))
p.start()
p.join()

我有这段代码,其中run_threaded_io的日志消息永远不会打印-那是因为

class Popen(object):

    def __init__(self, process_obj):
        sys.stdout.flush()
        sys.stderr.flush()
        self.returncode = None

        self.pid = os.fork()
        if self.pid == 0:
            if 'random' in sys.modules:
                import random
                random.seed()
            code = process_obj._bootstrap()
            sys.stdout.flush()
            sys.stderr.flush()
            os._exit(code)

如果pid不为0-process_obj._bootstrap()则永远不会发生-在内部将在run上调用targetrun_threaded_io并加入主进程({{1 }})永远不会完成。而且我快要超时了。

1 个答案:

答案 0 :(得分:0)

在这种情况下,父进程不等待子进程执行。因此,父级将完全执行并退出,而不会显示子级执行的任何结果。 您可以使用os.wait()等待孩子完全执行。