我可以在由Pool.imap调用的函数中使用多处理队列吗?
我正在使用Python 2.7,并尝试在自己的进程中运行一些CPU繁重的任务。 我希望能够发送消息回到父进程,以通知进程的当前状态。 多处理队列似乎是完美的,但我不知道如何得到它的工作。
所以,这是我的基本工作示例,减去使用队列。
import multiprocessing as mp import time def f(x): return x*x def main(): pool = mp.Pool() results = pool.imap_unordered(f, range(1, 6)) time.sleep(1) print str(results.next()) pool.close() pool.join() if __name__ == '__main__': main()
我试过用几种方式传递队列,并且他们得到错误消息“RuntimeError:队列对象应该只通过inheritance在进程间共享”。 这是我根据我发现的早期答案尝试的方法之一。 (我遇到同样的问题,试图使用Pool.map_async和Pool.imap)
import multiprocessing as mp import time def f(args): x = args[0] q = args[1] q.put(str(x)) time.sleep(0.1) return x*x def main(): q = mp.Queue() pool = mp.Pool() results = pool.imap_unordered(f, ([i, q] for i in range(1, 6))) print str(q.get()) pool.close() pool.join() if __name__ == '__main__': main()
最后,0健身方法(使其成为全球)不会产生任何消息,它只是locking。
import multiprocessing as mp import time q = mp.Queue() def f(x): q.put(str(x)) return x*x def main(): pool = mp.Pool() results = pool.imap_unordered(f, range(1, 6)) time.sleep(1) print q.get() pool.close() pool.join() if __name__ == '__main__': main()
我知道它可能会与多处理.Process直接工作,还有其他库来完成这个,但我讨厌退出标准的库函数,这是一个非常适合,直到我确定这不只是我的缺乏使我无法利用它们的知识。
谢谢。
诀窍是将队列作为parameter passing给初始值设定项。 似乎与所有池调度方法一起工作。
import multiprocessing as mp def f(x): fqput('Doing: ' + str(x)) return x*x def f_init(q): fq = q def main(): jobs = range(1,6) q = mp.Queue() p = mp.Pool(None, f_init, [q]) results = p.imap(f, jobs) p.close() for i in range(len(jobs)): print q.get() print results.next() if __name__ == '__main__': main()