使用带有cythonized类的dask。酸洗对象方法时出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用带有cythonized类的dask。酸洗对象方法时出错相关的知识,希望对你有一定的参考价值。

我想用以下类对python模块进行cython化:

class C:
    def __init__(self, x):
        self.x = x

    @staticmethod
    def f(k):
        return k

    def g(self, k):
        return self.x, k

安装cythonized模块后,我正在尝试执行代码:

from dask import delayed, multiprocessing
c = C(3)
l = []
for i in range(10):
    l.append(delayed(c.f)(i))

results = delayed(l).compute(num_workers=2, get=multiprocessing.get)

我有酸洗错误(静态和非静态方法相同):

~/anaconda/envs/cython_env/lib/python3.6/site-
packages/cloudpickle/cloudpickle.py in save_global(self, obj, name, 
pack)
    621             self.save_dynamic_class(obj)
    622         else:
--> 623             raise pickle.PicklingError("Can't pickle %r" % obj)
    624 
    625     dispatch[type] = save_global

PicklingError: Can't pickle <cyfunction C.f at 0x113582b10>

为什么会这样?

答案

我的猜测是你不应该使用共享对象或变量,如果你要使用多处理。你可以使用它与多线程。在你的情况下,C类是问题。你把同一个c的对象传递给了延迟

以上是关于使用带有cythonized类的dask。酸洗对象方法时出错的主要内容,如果未能解决你的问题,请参考以下文章

带有 RPYC 的多处理 Python “ValueError:酸洗已禁用”

为啥带有酸洗的多处理序列化取决于范围?

如何在 python 包装中使用 unicode 字符串用于带有 cython 的 c++ 类?

Pyspark UDF 酸洗错误,无法酸洗 SwigPyObject 对象

6个方法解决Python策略回测耗时问题

Python酸洗保持对象身份