Python多处理fork与spawn的实现细节



根据关于可拾取性的多处理文档,它声明

可酸洗性

确保代理方法的参数是可拾取的。

更易拾取

确保处理的所有参数init((是可拾取的。此外,如果您对Process进行子类化,那么请确保在调用Process.start方法时实例是可拾取的。

我认为这基本上意味着通过Process的参数发送的任何内容都将被pickle/unpickle。

但在比pickle/unpickle会话更适合继承,它指出

当使用派生或forkserver启动方法时,多处理中的许多类型需要是可拾取的,以便子进程可以使用它们。但是,通常应该避免使用管道或队列将共享对象发送到其他进程。相反,您应该安排程序,以便需要访问在其他地方创建的共享资源的进程可以从祖先进程继承该资源。

我进行了实验,显示了输出Read successfully.

def read_dataset(dataset, window):
return dataset.read(window=window)
if __name__ == "__main__":
mp.set_start_method("fork")
with rasterio.open(Path("test.tiff").absolute()) as dataset:
window = Window(col_off=0, row_off=0, width=100, height=100)
p1 = mp.Process(target=read_dataset, args=(dataset, window))
p1.start()
p1.join()
print("Read successfully.")

但当更改为mp.set_start_method("spawn")时,会显示以下错误。

Traceback (most recent call last):
File "test.py", line 88, in <module>
p1.start()
File "/usr/lib/python3.8/multiprocessing/process.py", line 121, in start
self._popen = self._Popen(self)
File "/usr/lib/python3.8/multiprocessing/context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "/usr/lib/python3.8/multiprocessing/context.py", line 284, in _Popen
return Popen(process_obj)
File "/usr/lib/python3.8/multiprocessing/popen_spawn_posix.py", line 32, in __init__
super().__init__(process_obj)
File "/usr/lib/python3.8/multiprocessing/popen_fork.py", line 19, in __init__
self._launch(process_obj)
File "/usr/lib/python3.8/multiprocessing/popen_spawn_posix.py", line 47, in _launch
reduction.dump(process_obj, fp)
File "/usr/lib/python3.8/multiprocessing/reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
File "stringsource", line 2, in rasterio._io.DatasetReaderBase.__reduce_cython__
TypeError: self._hds cannot be converted to a Python object for pickling

我的问题如下
使用fork生成子进程时,将继承变量,而不是pickled/unpickled。但是,当使用spawn生成子进程时,则通过pickle/upickleing发送参数。我在哪里可以找到这样的实现细节?谢谢

多处理上下文

popen叉

产卵叉

fork在内存中共享一个值并启动它。

spawn是通过为源代码创建cmd并通过pipe共享一些变量来实现的。

如果在生成前编辑并保存源代码,则可以获得修改后的代码的结果。

最新更新