酸洗和多处理
pickling and mulitprocessing
多处理模块和酸洗。
每当您需要使用我想更好地理解的多处理模块时,似乎都会进行一些酸洗。
显然,当项目不能被腌制时(无论出于何种原因),它们不能作为参数传递给多处理模块中的 Process 或 Pool 对象。为什么是这样?
是否有完整的列表或说明来解释何时不能 pickle 项目?
感谢任何能提供帮助的人。
所以 pickle
可以序列化的内容非常有限。完整的列表几乎在文档中给出了……这里:
https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled
和这里:
https://docs.python.org/2/library/pickle.html#what-can-be-pickled-and-unpickled.
情况变得更糟。腌制在解释器中并没有真正起作用,主要是因为 pickle
主要是通过引用序列化。它实际上并没有 pickle 函数或 class 对象,它序列化了一个字符串,该字符串本质上是它们的名称:
>>> import pickle
>>> import math
>>> pickle.dumps(math.sin)
'cmath\nsin\np0\n.'
因此,如果您已经构建了函数 class 或解释器中的任何内容,那么您基本上无法使用 pickle
腌制对象。它寻找 __main__
模块,pickle
找不到 __main__
。这也是解释器无法使用 multiprocessing
序列化的原因。
不过,有一个很好的解决办法。您可以使用更好的序列化器(如 dill
),以及利用更好的序列化器的 multiprocessing
的分支。
>>> import dill
>>> from pathos.multiprocessing import ProcessingPool as Pool
>>> p = Pool()
>>>
>>> def squared(x):
... return x**2
...
>>> dill.dumps(squared)
'\x80\x02cdill.dill\n_create_function\nq\x00(cdill.dill\n_unmarshal\nq\x01Ufc\x01\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00C\x00\x00\x00s\x08\x00\x00\x00|\x00\x00d\x01\x00\x13S(\x02\x00\x00\x00Ni\x02\x00\x00\x00(\x00\x00\x00\x00(\x01\x00\x00\x00t\x01\x00\x00\x00x(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<stdin>t\x07\x00\x00\x00squared\x01\x00\x00\x00s\x02\x00\x00\x00\x00\x01q\x02\x85q\x03Rq\x04c__builtin__\n__main__\nU\x07squaredq\x05NN}q\x06tq\x07Rq\x08.'
>>>
>>> p.map(squared, range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>>
这里有一个不错的列表,列出了哪些可以序列化,哪些不能序列化:
https://github.com/uqfoundation/dill/blob/master/dill/_objects.py
-- 它并不全面,但大多数东西都可以用 dill
.
序列化
在此处获取 pathos
和 dill
:https://github.com/uqfoundation
多处理模块和酸洗。
每当您需要使用我想更好地理解的多处理模块时,似乎都会进行一些酸洗。
显然,当项目不能被腌制时(无论出于何种原因),它们不能作为参数传递给多处理模块中的 Process 或 Pool 对象。为什么是这样?
是否有完整的列表或说明来解释何时不能 pickle 项目?
感谢任何能提供帮助的人。
所以 pickle
可以序列化的内容非常有限。完整的列表几乎在文档中给出了……这里:
https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled
和这里:
https://docs.python.org/2/library/pickle.html#what-can-be-pickled-and-unpickled.
情况变得更糟。腌制在解释器中并没有真正起作用,主要是因为 pickle
主要是通过引用序列化。它实际上并没有 pickle 函数或 class 对象,它序列化了一个字符串,该字符串本质上是它们的名称:
>>> import pickle
>>> import math
>>> pickle.dumps(math.sin)
'cmath\nsin\np0\n.'
因此,如果您已经构建了函数 class 或解释器中的任何内容,那么您基本上无法使用 pickle
腌制对象。它寻找 __main__
模块,pickle
找不到 __main__
。这也是解释器无法使用 multiprocessing
序列化的原因。
不过,有一个很好的解决办法。您可以使用更好的序列化器(如 dill
),以及利用更好的序列化器的 multiprocessing
的分支。
>>> import dill
>>> from pathos.multiprocessing import ProcessingPool as Pool
>>> p = Pool()
>>>
>>> def squared(x):
... return x**2
...
>>> dill.dumps(squared)
'\x80\x02cdill.dill\n_create_function\nq\x00(cdill.dill\n_unmarshal\nq\x01Ufc\x01\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00C\x00\x00\x00s\x08\x00\x00\x00|\x00\x00d\x01\x00\x13S(\x02\x00\x00\x00Ni\x02\x00\x00\x00(\x00\x00\x00\x00(\x01\x00\x00\x00t\x01\x00\x00\x00x(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<stdin>t\x07\x00\x00\x00squared\x01\x00\x00\x00s\x02\x00\x00\x00\x00\x01q\x02\x85q\x03Rq\x04c__builtin__\n__main__\nU\x07squaredq\x05NN}q\x06tq\x07Rq\x08.'
>>>
>>> p.map(squared, range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>>
这里有一个不错的列表,列出了哪些可以序列化,哪些不能序列化:
https://github.com/uqfoundation/dill/blob/master/dill/_objects.py
-- 它并不全面,但大多数东西都可以用 dill
.
在此处获取 pathos
和 dill
:https://github.com/uqfoundation