【问题标题】:python multi process queue completepython多进程队列完成
【发布时间】:2014-06-17 04:22:33
【问题描述】:

我做了一个简单的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 = Process(target=worker, args=(test,))

代替q,没有问题。

【问题讨论】:

    标签: python process queue multiprocess


    【解决方案1】:

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

    get([block[, timeout]])

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 2013-01-19
      • 2021-10-26
      • 2012-12-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多