python多进程获取函数返回值

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多进程获取函数返回值_第1张图片

你可能感兴趣的:(Python,Process)