我有一个对象实例,它包含两个队列,一个输入队列和一个输出队列。父进程生成几个在队列上工作的子进程。在
我的要求是:
fill()
)echo()
)read()
)self._shutdown
)设置为true,则所有进程都应结束,而不是等待队列项以下是我当前拥有的代码:
Python2.7最小示例
from multiprocessing import Queue, Process, Value
from ctypes import c_bool
from Queue import Empty
class A(object):
def __init__(self):
self._shutdown = Value(c_bool, False)
self._input_queue = Queue()
self._output_queue = Queue()
def echo(self):
while True:
if self._shutdown.value == True: break
try:
item = self._input_queue.get(True, timeout=1)
except Empty:
continue
print "[echo] read from input qeue: ", item
print "[echo] put into output queue: ", item*2
self._output_queue.put(item*2)
def fill(self):
for item in xrange(1,6):
print "[fill] put into input queue: ", item
self._input_queue.put(item)
def read(self):
while True:
if self._shutdown.value == True: break
try:
item = self._output_queue.get(True, timeout=1)
except Empty:
continue
print "[read] got from output queue: ", item
a = A()
p1 = Process(target=a.echo)
p2 = Process(target=a.echo)
p1.start()
p2.start()
a.fill()
a.read()
a._shutdown.value = True
上面脚本的输出是正确的:
^{pr2}$只是它会死锁,而且这个过程永远不会结束。这两个过程似乎相互阻碍。我的问题是:
为什么我的代码会死锁?我能做些什么来防止死锁?
您的}。您使它发生在}内部。因此,简单地说,}将永远运行。在
a.read()
是主线程中的同步调用,它会导致一个forever while循环,直到self._shutdown.value
成为{a.read
下的行上。因此a._shutdown.value = True
永远不会执行。那么,只有更改才会反映在p1
和{p1(process 1)
发生了什么事情,p2(process 2)
和{相关问题 更多 >
编程相关推荐