我正在尝试实现一个由两个进程并行运行并通过队列进行通信的池。
我们的目标是具有作家该传递消息到处理读取器通过使用进程队列。
每个过程都在终端上打印反馈以获取反馈。
这是代码:
#!/usr/bin/env python
import os
import time
import multiprocessing as mp
import Queue
def writer(queue):
pid = os.getpid()
for i in range(1,4):
msg = i
print "### writer ", pid, " -> ", msg
queue.put(msg)
time.sleep(1)
msg = 'Done'
print '### '+msg
queue.put(msg)
def reader(queue):
pid = os.getpid()
time.sleep(0.5)
while True:
print "--- reader ", pid, " -> ",
msg = queue.get()
print msg
if msg == 'Done':
break
if __name__ == "__main__":
print "Initialize the experiment PID: ", os.getpid()
mp.freeze_support()
queue = mp.Queue()
pool = mp.Pool()
pool.apply_async(writer, (queue))
pool.apply_async(reader, (queue))
pool.close()
pool.join()
我期望的输出应该是这样的:
Initialize the experiment PID: 2341
writer 2342 -> 1
reader 2343 -> 1
writer 2342 -> 2
reader 2343 -> 2
writer 2342 -> 3
reader 2343 -> 3
Done
但是我只得到这行:
Initialize the experiment PID: 2341
然后脚本退出。
在通过队列进行通信的池中,实现两个进程之间的进程间通信的正确方法是什么?
我用作mp.Manager().Queue()
队列是因为我们无法直接通过Queue
。尝试直接使用Queue
会导致异常,但由于使用,导致无法处理apply_async
。
我已将您的代码更新为:
#!/usr/bin/env python
import os
import time
import multiprocessing as mp
import Queue
def writer(queue):
pid = os.getpid()
for i in range(1,4):
msg = i
print "### writer ", pid, " -> ", msg
queue.put(msg)
time.sleep(1)
msg = 'Done'
print '### '+msg
queue.put(msg)
def reader(queue):
pid = os.getpid()
time.sleep(0.5)
while True:
print "--- reader ", pid, " -> ",
msg = queue.get()
print msg
if msg == 'Done':
break
if __name__ == "__main__":
print "Initialize the experiment PID: ", os.getpid()
manager = mp.Manager()
queue = manager.Queue()
pool = mp.Pool()
pool.apply_async(writer, (queue,))
pool.apply_async(reader, (queue,))
pool.close()
pool.join()
我得到以下输出:
Initialize the experiment PID: 46182
### writer 46210 -> 1
--- reader 46211 -> 1
### writer 46210 -> 2
--- reader 46211 -> 2
### writer 46210 -> 3
--- reader 46211 -> 3
### Done
--- reader 46211 -> Done
我相信这就是您的期望。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句