我试图在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有点慢,主循环需要继续执行其任务)
Queue.LifoQueue
不适合多处理,只有multiprocessing.Queue
适合,它是专门为这种情况设计的吗?这意味着放入Queue.LifoQueue
的值只对本地进程可用,因为队列不能在子进程之间共享。
一种可能性是使用来自SyncManager (SyncManager.list()
)的共享列表。当仅与append
和pop
一起使用时,列表的行为就像lifo队列。