1

当与并行 python 一起使用时,我在将任何信号量对象或将事件、管道、队列等对象同步到子进程时遇到问题,当我将队列传递给子进程时出现以下错误。'通过继承' % type(self).__name__ RuntimeError: 队列对象只能通过继承在进程之间共享

当我使用多处理库时没有看到任何问题

import pp
import time
from multiprocessing import Event, Queue, Manager, Pool

e = Queue()

def startt() :
    e.put(1)
    return 1


ppservers = ()
# Creates jobserver with automatically detected number of workers        
jobServer = pp.Server(ppservers=ppservers,proto=2)
#submit the work to the job pool or job server
job = jobServer.submit(startt,(e,),(),("time", ), globals = globals())
res = job()
print e.get()
print res
4

1 回答 1

2

您遇到此问题是因为您在提交作业时传递了队列对象:

job = jobServer.submit(startt,(e,),(),("time", ), globals = globals())
#                              ^ here

有两点需要注意:

  1. 队列已经是全局的。您不需要将其作为参数传递。

  2. 如果您使用multiprocessing.Manager ,则可以将队列作为参数传递:

manager = multiprocessing.Manager()
shared_queue = manager.Queue() # this shared queue can be passed as an argument

调用manager.Queue()实际上会将代理返回到队列而不是队列本身,并且管理器进程将在后台处理所有必要的同步。

于 2015-06-16T16:19:41.367 回答