多个进程读取和写入队列,直到对象属性为tru

2024-04-25 22:30:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个对象实例,它包含两个队列,一个输入队列和一个输出队列。父进程生成几个在队列上工作的子进程。在

我的要求是:

  • 应该可以随时填充输入队列(下面代码中的函数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}$

只是它会死锁,而且这个过程永远不会结束。这两个过程似乎相互阻碍。我的问题是:

为什么我的代码会死锁?我能做些什么来防止死锁?


Tags: fromechoselftruereadinputoutput队列
1条回答
网友
1楼 · 发布于 2024-04-25 22:30:28

您的a.read()是主线程中的同步调用,它会导致一个forever while循环,直到self._shutdown.value成为{}。您使它发生在a.read下的行上。因此a._shutdown.value = True永远不会执行。那么,只有更改才会反映在p1和{}内部。因此,简单地说,p1(process 1)发生了什么事情,p2(process 2)和{}将永远运行。在

相关问题 更多 >

    热门问题