https://blog.csdn.net/weixin_45912307/article/details/109079998
1. 进程概念
一个正在运行的程序或软件就是一个进程,是操作系统进行资源分配的基本单位
一个程序运行后至少有一个进程,一个进程默认有一个线程,线程依赖进程。
2. 进程类语法
Process([group [, target [, name [, args [, kwargs]]]]])
group:指定进程组,目前只能使用None
target:执行的目标任务名
name:进程名字
args:以元组方式给执行任务传参
kwargs:以字典方式给执行任务传参
Process创建的实例对象的常用方法:
start():启动子进程实例(创建子进程)
join():等待子进程执行结束
terminate():不管任务是否完成,立即终止子进程
Process创建的实例对象的常用属性:
name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
2.进程基本使用
# 1. 导入进程包
import multiprocessing
# 2. 创建子进程并制定执行的任务
sub_process = multiprocessing.Process(target=任务名)
# 3. 启动进程执行任务
sub_process.start()
3. 解决:主进程退出子进程销毁
import multiprocessing
import time
def task():
while True:
print('任务执行中...')
time.sleep(0.1)
# 标准python写法,直接执行的模块,需加上判断是否是主模块代码
if __name__ == '__main__':
# 创建子进程
sub_process = multiprocessing.Process(target=task)
sub_process.daemon = True # 法1:子进程守护主进程
sub_process.start()
# 主进程延时0.5s
# 退出主进程之前,先让子进程进行销毁
time.sleep(0.5)
sub_process.terminate()
print('退出主进程')
# 结论:主进程会等待子进程完成后程序再退出
# 解决:主进程退出子进程销毁
# 1. 让子进程设置为守护主进程,主进程退出子进程销毁,子进程依赖主进程
# 2. 让主进程退出之前先让让子进程销毁
4. 多进程
# 1. 导入进程包
import multiprocessing
# 任务1
# task1
def task1():
for i in range(3):
print('do task1...')
# 任务2
def task2():
for i in range(5):
print('deal task2')
# 2. 创建子线程(自己动手创建的过程称为子线程,在__init__文件中已经导入的Process类
task1_process = multiprocessing.Process(target=task1)
task2_process = multiprocessing.Process(target=task2)
# 3 .启动进程执行对应的任务
task1_process.start()
# 当前让主进程等待task1(任务1)的进程执行完成后代码再往下执行
task1_process.join()
task2_process.start()
5. 执行带有参数的任务
import multiprocessing
def show_info(name, age):
print(name, age)
if __name__ == '__main__':
# 1 以元组方式传参,元组里面的元素顺序要和函数的参数顺序保持一致,注意:若传入参数只有一个,需加一个‘,’,元组形式(param,)
sub_process = multiprocessing.Process(target=show_info, args=('张三', '18'))
sub_process.start()
# 2 以字典方式传参,字典里元素顺序不需和函数参数顺序保持一致
sub_process = multiprocessing.Process(target=show_info,kwargs={'age':20,'name':'张三'})
sub_process.start()
6. 进程总结:
- 进程间不共享全局变量
- 主进程等所有子进程执行结束再结束
- 进程执行是无序的,由系统任务调度决定