python多进程队列完成

时间:2014-06-17 04:22:33

标签: python process queue multiprocess

我制作了一个简单的python程序,下面是源代码。

# -*- coding: utf-8 -*-
  import sys
  from multiprocessing import Process, Queue

  def worker(q):
      test = q.get()
      print str(test) + ' success!'

  if __name__ == "__main__":
         test = ['a','e','f','d',1,2]
         print test

         q = Queue()
         q.put(test)

         p0 = Process(target=worker, args=(q,))
         p0.start()
         p0.join()

         print 'python exit!!'

这是成功输出。

['a', 'e', 'f', 'd', 1, 2]
['a', 'e', 'f', 'd', 1, 2] success!
python exit!!

但是当我运行如下所示的程序时,它只运行两个进程。

# -*- coding: utf-8 -*-
  import sys
  from multiprocessing import Process, Queue

  def worker(q):
      test = q.get()
      print str(test) + ' success!'

  if __name__ == "__main__":
         test = ['a','e','f','d',1,2]
         print test

         q = Queue()
         q.put(test)

         p0 = Process(target=worker, args=(q,))
         p1 = Process(target=worker, args=(q,))
         p0.start()
         p1.start()
         p0.join()
         p1.join()

         print 'python exit!!'

它的输出。

['a', 'e', 'f', 'd', 1, 2]
['a', 'e', 'f', 'd', 1, 2] success!

程序没有结束!问题是什么。队列有什么问题吗?当我使用

运行时
  

p0 =进程(target = worker,args =(test,))

而不是q,没有问题。

1 个答案:

答案 0 :(得分:0)

https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Queue.get

get([block[, timeout]])

  

从队列中删除并返回一个项目。如果可选的args块为True(默认值)且timeout为None(默认值),则在必要时阻止,直到某个项可用为止。如果timeout是一个正数,它会阻止最多超时秒,如果在该时间内没有可用的项,则会引发Queue.Empty异常。否则(块为False),如果一个项立即可用,则返回一个项,否则引发Queue.Empty异常(在这种情况下忽略超时)。

因此,当您致电p0.start()时,它会删除队列中的所有项目。调用p1.start()后,方法q.get()必须等到队列项可用。