我很难在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创建为不在类中的顶级对象,则代码运行良好。
Python序列化(默认情况下为pickle(在进程空间之间来回移动的对象,而不是依赖于两个进程之间可能存在的任何类型的共享内存。因此,您必须小心您的函数可以访问的内容,Python必须将其带到您的函数将运行的其他进程中