【问题标题】:Does os.fork() pick up where it left off?os.fork() 会从中断的地方继续吗?
【发布时间】:2019-06-14 23:42:50
【问题描述】:

我有一个正在处理某些数据的函数,如果数据符合某个标准,则在处理其余数据时将单独处理它。

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

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

【问题讨论】:

  • 反对使用multiprocessing 模块?为什么要一直下到os.fork()
  • @yorodm 不,我对多处理模块没有任何意见,我不确定是什么让你这么想,但是在阅读了模块上的文档后,我只是认为 os.fork() 会可能更适合我的需要。
  • 这正是我所说的“反对它”的意思(又名对你不起作用)
  • @aeaglez 我和 yorodm 一起讨论这个问题; os.fork 按照 python 标准来说是非常低级的,它通常存在以填补特定的利基。 multiprocessing 提供了一个建立在 fork API 之上的更健全的 API。

标签: python python-multiprocessing


【解决方案1】:

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

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

现在,您需要照顾分叉子进程的绝对最低要求是确保您为他们wait() 并正确地获得他们的返回码,否则您将(至少暂时)创建僵尸。这实际上意味着您可能想要实现一个SICHLD 处理程序来获取您的进程的子进程,因为它们已完成执行。

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

【讨论】:

  • 它有专门的代码,我唯一在考虑的是他们如何再次加入一个进程。对于多处理,我可以生成一个新进程,保持当前进程运行,然后在关键部分结束之前加入它们?这样就够了吗?
  • 短版是可以的。 .join() 将等待另一个进程完成(如果它同时没有这样做)。除非您真的需要低级控制,否则我更喜欢更舒适的抽象,这应该允许更简单的代码。
猜你喜欢
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多