0

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

4

1 回答 1

1

Queue.LifoQueue不适合多处理,只是multiprocessing.Queue,它是专门为这个用例设计的。这意味着放入 a 的值Queue.LifoQueue将仅对本地进程可用,因为队列不在子进程之间共享。

一种可能是使用来自 SyncManager ( SyncManager.list()) 的共享列表。仅append与 and一起使用时pop,列表的行为就像 lifo 队列。

于 2015-08-13T07:41:37.747 回答