跳转至

多进程


import os
import time
from multiprocessing import Process


def sub_process(name, age, *args, **kwargs):
    for _ in range(3):
        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()}')
    process = Process(target=sub_process, args=('king', 18, 'balabala...', 'makabaka...'), kwargs={'key': 'value'})
    process.start()
    print('主进程运行完毕')


if __name__ == '__main__':
    main()

输出:

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

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

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

解释:

main函数是主进程,由下而下执行,先输出"主进程开始运行, pid为: 74799", process.start()开启子进程,紧接着输出"主进程运行完毕", 然后,子进程开始循环3次输出

修改main函数代码,加入join方法的调用:

def main():
    print(f'主进程开始运行, pid为: {os.getpid()}')
    process = Process(target=sub_process, args=('king', 18, 'balabala...', 'makabaka...'), kwargs={'key': 'value'})
    process.start()
    process.join()
    print('主进程运行完毕')

输出:

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

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

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

主进程运行完毕

解释:

对比修改前代码的输出, "主进程运行完毕"最后输出,是因为join()致使主进程进入阻塞状态, 等待子进程执行完毕后才会继续执行

再次修改main函数代码, 取消join()方法, 设置守护进程:

def main():
    print(f'主进程开始运行, pid为: {os.getpid()}')
    process = Process(target=sub_process, args=('king', 18, 'balabala...', 'makabaka...'), kwargs={'key': 'value'})
    process.daemon = True
    process.start()
    print('主进程运行完毕')

或加入terminate()方法:

def main():
    print(f'主进程开始运行, pid为: {os.getpid()}')
    process = Process(target=sub_process, args=('king', 18, 'balabala...', 'makabaka...'), kwargs={'key': 'value'})
    process.start()
    process.terminate()
    print('主进程运行完毕')

输出:

主进程开始运行, pid为: 75683
主进程运行完毕

解释:

process.daemon = True, 和前面说到多线程一样必须在start之前设定

process.terminate()方法都会致使主进程强制结束子进程的运行

最终结果都是子进程的内容没有输出