我正在使用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()
我已经尝试过多种方法将Queue传递给其他进程,但是一直收到错误信息“RuntimeError:Queue对象只应通过继承在进程之间共享”。这里是我基于早期找到的一个答案尝试的其中一种方式。(我在尝试使用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适应度方法(使其全局)不会生成任何消息,只会锁死。
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()
我知道直接使用multiprocessing.Process可能会起作用,也有其他库可以完成此操作,但在确定不仅仅是我的知识缺乏阻止我能够利用它们之前,我不想放弃非常适合的标准库函数。
谢谢。