【发布时间】:2016-08-05 21:22:22
【问题描述】:
假设我在一个类中有一个包含几个进程的池,用于进行一些处理,如下所示:
class MyClass:
def __init_(self):
self.pool = Pool(processes = NUM_PROCESSES)
self.pop = []
self.finished = []
def gen_pop(self):
self.pop = [ self.pool.apply_async(Item.test, (Item(),)) for _ in range(NUM_PROCESSES) ]
while (not self.check()):
continue
# Do some other stuff
def check(self):
self.finished = filter(lambda t: self.pop[t].ready(), range(NUM_PROCESSES))
new_pop = []
for f in self.finished:
new_pop.append(self.pop[f].get(timeout = 1))
self.pop[f] = None
# Do some other stuff
当我运行这段代码时,我得到一个cPickle.PicklingError,它指出<type 'function'> 不能被腌制。这告诉我的是 apply_async 函数之一尚未返回,因此我试图将正在运行的函数附加到另一个列表。但这不应该发生,因为应该使用 ready() 函数过滤掉所有正在运行的调用。
在相关说明中,Item 类的实际性质并不重要,但重要的是,在我的 Item.test 函数的顶部,我有一个 print 语句,它应该出于调试目的而触发。但是,这不会发生。这告诉我该函数已启动但尚未真正开始执行。
那么,ready() 似乎并没有真正告诉我调用是否已完成执行。 ready() 到底是做什么的,我应该如何编辑我的代码以便过滤掉仍在运行的进程?
【问题讨论】:
-
你为什么认为
cPickle.PicklingError是这个意思? -
@zwol 我真的不知道。相反,我认为该错误是实际问题的症状,我的问题中对此进行了详细说明。
-
我的意思是我认为你对实际问题的诊断是错误的。
标签: python multiprocessing pool