Python os.fork()是否从它停止的地方开始?

Python os.fork()是否从它停止的地方开始?,python,python-multiprocessing,Python,Python Multiprocessing,我有一个函数,其中某些数据正在被处理,如果数据满足某个标准,那么在处理其余数据时,它将被单独处理 作为一个任意的例子,如果我正在抓取一个网页并收集一个元素的所有属性,其中一个元素是一个表单,而且恰好是隐藏的,我希望单独处理它,而其余的元素可以继续处理: def get_hidden_forms(element_att): if element_att == 'hidden': os.fork() # handle this seperate els

我有一个函数,其中某些数据正在被处理,如果数据满足某个标准,那么在处理其余数据时,它将被单独处理

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

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()复制了对象的所有信息,但我可以在进行fork之前更改值,如中所述。

fork
基本上创建了一个进程的克隆,该进程使用新的地址空间和新的PID调用它

从那时起,两个进程将继续运行
fork()
调用后的下一条指令。为此,您通常会检查它的返回值并决定什么是适当的操作。如果它返回
int
大于
0
,则它是子进程的PID,并且您知道您位于其父进程中。。。你继续工作。如果它等于
0
,则您处于子进程中,应该做子进程的工作。值小于
0
意味着
fork
失败,Python将处理该问题并引发您应该处理的
OSError
(您仍然在其中,并且只有一个父级)

现在,您需要注意的最起码的一点是,分叉子进程时,还要确保您为它们
wait()
,并正确获取它们的返回代码,否则您将(至少暂时)创建僵尸。这实际上意味着您可能希望实现一个
SICHLD
处理程序,以便在执行过程中获得进程的子进程


理论上,你可以用你描述的方式使用它,但它可能有点太“低级”(而且不舒服)为此,如果您有专门的代码来处理您想要单独处理的内容,并使用这些代码在单独的进程中运行这些额外的工作,那么可能会更容易执行和阅读/理解。

有什么反对使用
多处理
模块的吗?为什么要一直到
os.fork()
?@yorodm不,我不反对多处理模块,我不知道是什么让你这么想的,但在阅读了模块上的文档后,我认为os.fork()可能会更适合我的需要。这正是我所说的“反对它的任何东西”的意思(a.k.a不适合你)@aeaglez我在这方面与yorodm合作;
os.fork
在python标准中是非常低级的,它的存在通常是为了填补一个特定的领域。
multi-processing
提供了一个构建在
fork
API之上的更理智的API。它有专门的代码,我唯一考虑的是它们如何在一个过程中结合在一起再次强调。对于多进程,我可以生成一个新进程,保持当前进程运行,然后在关键部分结束之前加入它们?这样就足够了吗?简短的版本是肯定的。将等待另一个进程完成(如果同时没有完成).除非您真的需要底层控制,否则我更喜欢更大的抽象,这应该允许更简单的代码。