os.fork()是否从上次停止的地方接听?

时间:2019-01-21 14:49:03

标签: python python-multiprocessing

我有一个功能,可以处理某些数据,如果数据满足特定条件,则在处理其余数据时将单独处理。

作为一个任意示例,如果我要抓取网页并收集元素的所有属性,则其中一个元素是一种表单,正好被隐藏了,我想将其分开处理,而其余部分元素可以继续处理:

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中所述。

1 个答案:

答案 0 :(得分:1)

fork基本上会创建一个进程的克隆,并使用新的地址空间和新的PID对其进行调用。

从那时起,两个进程将在fork()调用之后继续运行下一条指令。为此,您通常检查它的返回值并决定什么是适当的操作。如果返回的int大于0,则它是子进程的PID,并且您知道自己在其父进程中...继续父进程。如果等于0,则说明您处于子进程中,应该执行子进程。小于0的值表示fork失败了,Python会处理该错误并提出您应该处理的OSError(您仍然在并且只有一个父母)。

现在,您需要确保分叉子进程的绝对最低限度是还要确保为他们wait()并正确获得其返回码,否则,您(至少暂时)会创建僵尸。实际上,这意味着您可能想要实现一个SICHLD处理程序,以在执行过程完成时收获进程的子级残骸。

理论上,您可以按照描述的方式使用它,但是这样做可能有点“低级”(不舒服),并且如果您有专用的代码,可能会更容易做和阅读/理解。您要分别处理的内容,并使用multiprocessing处理在单独的流程中运行这些额外的工作。