我试图在Python中使用多处理来让一个函数在循环中被调用,然后从函数中访问最新的返回值(通过将值存储在LIFO队列中)。
以下是主程序
的代码段q = Queue.LifoQueue()
while True:
p = multiprocessing.Process(target=myFunc, args = (q))
p.daemon = True
p.start()
if not q.empty():
#do something with q.get()
这是myFunc的代码片段
def myFunc(q):
x = calc()
q.put(x)
问题是,主循环认为q为空。但是,我已经检查过myFunc()是否将值放入q(通过在q.put(x)之后放置q.empty())并且队列不应为空。
我能做些什么,以便主循环可以看到队列中的值?还是我以低效的方式解决这个问题? (我确实需要myFunc和主循环单独运行,因为myFunc有点慢,主循环需要继续执行其任务)
答案 0 :(得分:1)
Queue.LifoQueue
不适合多处理,只有multiprocessing.Queue
是,它是专门为此用例设计的。这意味着放入Queue.LifoQueue
的值只能用于本地进程,因为子进程之间不共享队列。
可能的方法是使用SyncManager(SyncManager.list()
)中的共享列表。仅与append
和pop
一起使用时,列表的行为就像一个生命队列。