Python 使用 (LIFO) 队列进行多处理
Python Multiprocessing With (LIFO) Queues
我正在尝试在 Python 中使用多处理来让函数在循环中不断被调用,然后从函数中访问最新的 return 值(通过将值存储在后进先出队列)。
这是主程序的代码片段
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 有点慢,主循环需要继续执行它的任务)
Queue.LifoQueue
不适合多处理,只有 multiprocessing.Queue
适合,它是专门为这个用例设计的。这意味着放入 Queue.LifoQueue
的值将只对本地进程可用,因为队列不在子进程之间共享。
一种可能是使用来自 SyncManager (SyncManager.list()
) 的共享列表。当仅与 append
和 pop
一起使用时,列表的行为就像后进先出队列。
我正在尝试在 Python 中使用多处理来让函数在循环中不断被调用,然后从函数中访问最新的 return 值(通过将值存储在后进先出队列)。
这是主程序的代码片段
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 有点慢,主循环需要继续执行它的任务)
Queue.LifoQueue
不适合多处理,只有 multiprocessing.Queue
适合,它是专门为这个用例设计的。这意味着放入 Queue.LifoQueue
的值将只对本地进程可用,因为队列不在子进程之间共享。
一种可能是使用来自 SyncManager (SyncManager.list()
) 的共享列表。当仅与 append
和 pop
一起使用时,列表的行为就像后进先出队列。