​welcome to my blog​

创建进程的方式有两种, 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()

细节: 队列中的数据不能太多! 之前写程序卡在这里两天, 官方文档警告! ​​文档连接​

python多进程获取函数返回值_构造函数