python 多处理中的 pickle 字符串

python pickle string in multiprocessing

我在 python 中很难使用多处理,尽管我在任何平台上都没有使用太多多处理,也不清楚队列在多进程通信中是如何工作的。 (如果有人能提供一个简单的参考,那将是很大的帮助)。

问题来了:

from concurrent.futures.process import ProcessPoolExecutor

class Sample:
    def __init__(self):
        self.bla_exec = ProcessPoolExecutor(max_workers=1)

    def blafunc(self,stt):
        print('sdasdadadsa::::::::',stt)

    def on_ticks(self,  ticks):
        f=self.bla_exec.submit(self.blafunc,ticks)
        print(f.result()) //If I dont do .result(), nothing gets printed
if __name__ == '__main__':
    Sample().on_ticks('123')

这给我错误:

TypeError: cannot pickle 'weakref' object

请注意,我故意 f.result() 只是为了测试我的样本。

认为它正在做的是尝试 pickle ProcessPoolExecutor,因为您尝试 运行 在池中的函数是一个绑定方法。它绑定到的对象是一个 Sample,其中包含对您的 ProcessPoolExecutor 的引用。如果我将 ProcessPoolExecutor 创建为不在 class 中的 top-level 对象,您的代码 运行 没问题。

Python 序列化(默认情况下是泡菜)在进程空间之间来回移动的对象,而不是依赖于两个进程之间可能存在的任何类型的共享内存。所以你必须小心你的函数可以访问什么 Python 必须带入你的函数将 运行 进入的另一个进程。