os.fork() 会从中断的地方继续吗?

Does os.fork() pick up where it left off?

我有一个正在处理特定数据的功能,如果数据满足特定条件,则在处理其余数据时将其分开处理。

举个任意的例子,如果我正在抓取一个网页并收集一个元素的所有属性,其中一个元素是一个表单,恰好被隐藏了,我想单独处理它,而其余元素可以继续处理:

def get_hidden_forms(element_att):
    if element_att == 'hidden':
        os.fork()
        # handle this seperate
    else:
        # continue handling any elements that are not hidden
    #join both processes

这可以用 os.fork() 完成还是有其他用途?

我知道 os.fork() 会复制对象的所有内容,但我可以在分叉之前更改值,如 this post.

中所述

fork 基本上是用新地址 space 和新 PID 创建调用它的进程的克隆。

从那时起,两个进程将在 fork() 调用之后继续 运行 下一条指令。为此,您通常会检查它的 return 值并决定什么是适当的操作。如果它 return int 大于 0,它是 child 进程的 PID,你知道你在它的 parent... 你继续 parent 的工作。如果等于 0,则您处于 child 进程中,应该执行 child 的工作。小于 0 的值意味着 fork 失败,Python 会处理它并引发你应该处理的 OSError (你还在里面,只有一个 parent).

现在,您分叉了一个 child 进程后,您至少需要确保自己 wait() 并正确获取他们的 return 代码,否则你会(至少暂时)制造僵尸。这实际上意味着您可能想要实现一个 SICHLD 处理程序来获取您的进程' children 在执行完成后仍然存在。

理论上你可以按照你描述的方式使用它,但它可能有点太 "low level"(而且不舒服),也许会更容易做到,read/understand 如果您有专门的代码来处理您想要单独处理的内容,并使用 multiprocessing 在单独的进程中处理 运行 这个额外的工作。