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
在单独的进程中处理 运行 这个额外的工作。
我有一个正在处理特定数据的功能,如果数据满足特定条件,则在处理其余数据时将其分开处理。
举个任意的例子,如果我正在抓取一个网页并收集一个元素的所有属性,其中一个元素是一个表单,恰好被隐藏了,我想单独处理它,而其余元素可以继续处理:
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
在单独的进程中处理 运行 这个额外的工作。