【问题标题】:pickling and mulitprocessing酸洗和多重处理
【发布时间】:2015-01-04 20:45:13
【问题描述】:

多处理模块和酸洗。

每当您需要使用我想更好地理解的多处理模块时,似乎都会发生一些酸洗。

显然,当项目不能被腌制(无论出于何种原因)时,它们不能作为参数传递给多处理模块中的 Process 或 Pool 对象。为什么是这样?

是否有完整的列表或说明说明何时不能腌制物品?

感谢任何可以提供帮助的人。

【问题讨论】:

标签: python multiprocessing


【解决方案1】:

所以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.

情况变得更糟。 Pickling 在解释器中并没有真正起作用,主要是因为pickle 主要是通过引用进行序列化。它实际上并没有腌制函数或类对象,它序列化一个本质上是它们名称的字符串:

>>> import pickle
>>> import math
>>> pickle.dumps(math.sin)
'cmath\nsin\np0\n.'

因此,如果您在解释器中构建了函数、类或其他任何内容,那么您基本上无法使用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序列化。

在此处获取pathosdillhttps://github.com/uqfoundation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    相关资源
    最近更新 更多