使用(LIFO)队列进行Python多处理

时间:2015-08-13 07:14:20

标签: python queue multiprocessing lifo

我试图在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有点慢,主循环需要继续执行其任务)

1 个答案:

答案 0 :(得分:1)

Queue.LifoQueue不适合多处理,只有multiprocessing.Queue是,它是专门为此用例设计的。这意味着放入Queue.LifoQueue的值只能用于本地进程,因为子进程之间不共享队列。

可能的方法是使用SyncManager(SyncManager.list())中的共享列表。仅与appendpop一起使用时,列表的行为就像一个生命队列。