python多进程获取函数返回值
原创
©著作权归作者所有:来自51CTO博客作者littlehaes的原创作品,请联系作者获取转载授权,否则将追究法律责任
创建进程的方式有两种, 1.封装一个类, 并让该类继承multiprocessing.Process类 2.将方法名和参数传给multiprocessing.Process()的构造函数;
每个进程都有一套自己的内存, 所以在子进程中创建的list或者dict没法直接传回子进程, 只能用多进程模块提供的队列或者管道
import multiprocessing
import random
import os
class MyClass(multiprocessing.Process):
def __init__(self, arr, queue):
super().__init__()
self.arr = arr
self.queue = queue
def calPow(self):
print('父进程id:', os.getppid(), '\t当前子进程id:', os.getpid(), '\n')
res = []
for i in self.arr:
res.append(i * i)
# 将结果放入队列
self.queue.put(res)
def run(self):
self.calPow()
def main():
# 生成4个长度为5的list, 等会用4个进程分别计算这4个list中元素的平方
arrs = [[random.randint(1, 15) for x in range(5)] for x in range(4)]
jobs = []
print('\n打印4个list:')
for i in range(4):
print(arrs[i])
# 使用4个进程
print('\n调用4个子进程:')
queues = []
for i in range(4):
# 使用多进程时,一般使用消息机制实现进程间通信
# 每个进程都有一套自己的内存, 所以在子进程中创建的容器没法直接传回子进程, 只能用多进程模块提供的队列或者管道
queue = multiprocessing.Queue()
queues.append(queue)
t = MyClass(arrs[i], queue)
jobs.append(t)
t.start()
result = []
# 获取每个进程的结果
# print('\n获取每个进程的结果')
for i, t in enumerate(jobs):
# 等待子进程完成
t.join()
# 获取子进程的结果
result.append(queues[i].get())
print('\n打印最终结果:')
for i in result:
print(i)
if __name__ == '__main__':
main()
细节: 队列中的数据不能太多! 之前写程序卡在这里两天, 官方文档警告! 文档连接