跳转至

多进程之进程池


import os
import time
from multiprocessing import Pool


def sub_process(name, age, *args, **kwargs):
    for _ in range(2):
        print(f'子进程开始运行, pid为: {os.getpid()}')
        print(f"我是{name}, 今年{age}")
        print(f'args: {args}, kwargs: {kwargs}')
        print(f'父进程的pid是: {os.getppid()}')
        print()
        time.sleep(1)


def main():
    print(f'主进程开始运行, pid为: {os.getpid()}')

    # 创建进程池,最大进程数量等于两倍的CPU核数
    pool = Pool(os.cpu_count() * 2)
    for _ in range(2):
        # 使用进程池调用子进程
        pool.apply_async(sub_process, ('king', 18, 'balabala...', 'makabaka...'), {'key': 'value'})

    # 关闭进程池,之后不再接收新的请求
    pool.close()
    # 必须先pool.close()之后才能使用pool.join()
    pool.join()
    print('主进程运行完毕')


if __name__ == '__main__':
    main()

输出:

主进程开始运行, pid为: 80054
子进程开始运行, pid为: 80058
我是king, 今年18
args: ('balabala...', 'makabaka...'), kwargs: {'key': 'value'}
父进程的pid是: 80054

子进程开始运行, pid为: 80059
我是king, 今年18
args: ('balabala...', 'makabaka...'), kwargs: {'key': 'value'}
父进程的pid是: 80054

子进程开始运行, pid为: 80058
我是king, 今年18
args: ('balabala...', 'makabaka...'), kwargs: {'key': 'value'}
父进程的pid是: 80054

子进程开始运行, pid为: 80059
我是king, 今年18
args: ('balabala...', 'makabaka...'), kwargs: {'key': 'value'}
父进程的pid是: 80054

主进程运行完毕