为什么我不能把process在Pool成Queue?
这里我的代码在使用时有效Pool并且可以获得Test实例属性。
from multiprocessing import Pool
from multiprocessing import Queue
class Test(object):
def __init__(self, num):
self.num = num
if __name__ == '__main__':
p = Pool()
procs = []
for i in range(5):
proc = p.apply_async(Test, args=(i,))
procs.append(proc)
p.close()
for each in procs:
test = each.get(10)
print(test.num)
p.join()
当我尝试使用Queuenot pythonlist来存储进程时,这是行不通的。
我的代码:
from multiprocessing import Pool
from multiprocessing import Queue
class Test(object):
def __init__(self, num):
self.num = num
if __name__ == '__main__':
p = Pool()
q = Queue()
for i in range(5):
proc = p.apply_async(Test, args=(i,))
q.put(proc)
p.close()
while not q.empty():
q.get()
p.join()
错误消息:
Traceback (most recent call last):
File "C:\Users\laich\AppData\Local\Programs\Python\Python36-
32\lib\multiprocessing\queues.py", line 234, in _feed
obj = _ForkingPickler.dumps(obj)
File "C:\Users\laich\AppData\Local\Programs\Python\Python36-
32\lib\multiprocessing\reduction.py", line 51, in dumps
cls(buf, protocol).dump(obj)
TypeError: can't pickle _thread.lock objects
我去看多处理文档:
class multiprocessing.Queue([maxsize]) 返回使用管道和一些锁/信号量实现的进程共享队列。当一个进程第一次将一个项目放入队列时,一个馈线线程将启动,它将对象从缓冲区传输到管道中。
标准库队列模块中的通常queue.Empty和queue.Full异常被引发以发出超时信号。
Queue 实现了queue.Queue除了task_done()and之外的所有方法join()。
这里说“放置一个项目”,这个项目不能是任何东西(python对象)?在我来说,我试图把process在Pool()成Queue。
牛魔王的故事
HUX布斯
相关分类