gpt4 book ai didi

Python 未实现错误 : pool objects cannot be passed between processes

转载 作者:太空狗 更新时间:2023-10-29 17:13:20 26 4
gpt4 key购买 nike

当页面附加到页面列表时,我试图交付工作,但我的代码输出返回 NotImplementedError。这是我正在尝试做的代码:

代码:

from multiprocessing import Pool, current_process
import time
import random
import copy_reg
import types
import threading


class PageControler(object):
def __init__(self):
self.nProcess = 3
self.pages = [1,2,3,4,5,6,7,8,9,10]
self.manageWork()


def manageWork(self):

self.pool = Pool(processes=self.nProcess)

time.sleep(2)
work_queue = threading.Thread(target=self.modifyQueue)
work_queue.start()

#pool.close()
#pool.join()

def deliverWork(self):
if self.pages != []:
pag = self.pages.pop()
self.pool.apply_async(self.myFun)


def modifyQueue(self):
t = time.time()
while (time.time()-t) < 10:
time.sleep(1)
self.pages.append(99)
print self.pages
self.deliverWork()

def myFun(self):
time.sleep(2)


if __name__ == '__main__':
def _pickle_method(m):
if m.im_self is None:
return getattr, (m.im_class, m.im_func.func_name)
else:
return getattr, (m.im_self, m.im_func.func_name)

copy_reg.pickle(types.MethodType, _pickle_method)

PageControler()

输出:

NotImplementedError: pool objects cannot be passed between processes or pickled

有什么方法可以在进程之间传递池对象?

编辑:

我正在使用 Python 2.6

最佳答案

为了 pickle 您试图传递给 Pool 的实例方法,Python 需要 pickle 整个 PageControler 对象,包括它的实例变量。其中一个实例变量是 Pool 对象本身,而 Pool 对象无法被 pickle,因此会出现错误。您可以通过实现 __getstate__ 来解决此问题在对象上,并使用它在 pickling 之前从实例中删除 pool 对象:

class PageControler(object):
def __init__(self):
self.nProcess = 3
self.pages = [1,2,3,4,5,6,7,8,9,10]
self.manageWork()


def manageWork(self):

self.pool = Pool(processes=self.nProcess)

time.sleep(2)
work_queue = threading.Thread(target=self.modifyQueue)
work_queue.start()

#pool.close()
#pool.join()

def deliverWork(self):
if self.pages != []:
pag = self.pages.pop()
self.pool.apply_async(self.myFun)


def modifyQueue(self):
t = time.time()
while (time.time()-t) < 10:
time.sleep(1)
self.pages.append(99)
print self.pages
self.deliverWork()

def myFun(self):
time.sleep(2)

def __getstate__(self):
self_dict = self.__dict__.copy()
del self_dict['pool']
return self_dict

def __setstate__(self, state):
self.__dict__.update(state)

__getstate__ 始终在 pickle 对象之前调用,并允许您准确指定对象状态的哪些部分实际上应该被 pickle。然后在拆开后,__setstate__(state)如果它已实现(在我们的例子中),则将被调用,否则,__getstate__ 返回的 dict 将用作 __dict__ 对于未腌制的实例。在上面的示例中,我们明确地将 __dict__ 设置为我们在 __getstate__ 中返回的 dict,但我们可能只是没有实现 __setstate__ 并获得相同的效果。

关于Python 未实现错误 : pool objects cannot be passed between processes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25382455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com