多进程
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()方法都会致使主进程强制结束子进程的运行
最终结果都是子进程的内容没有输出