一. 进程
1. 进程概述
进程就是计算机中程序的一次运行活动(Process),是操作系统的结构基础。
2. 创建进程
from multiprocessing import Process
process = Process(target=函数, name=进程名, args=(函数需要的参数,))
process # 是一个进程对象
process.run() # 运行任务, 不启动进程
process.name() # 获取进程名字
process.start() # 运行进程, 执行函数
process.terminate() # 终止进程
当多个进程共同访问|修改一个全局变量的时候,变量在各进程中单独存在
3.自定义进程
自定义进程用来访问自己的方法
-
继承Process类
-
重写__init__方法添加自己的属性, 使用super()加载父类属性
- super(当前类, self).__init__()
-
重写run方法, 内容就写在此方法中
4.进程池与阻塞和非阻塞
进程池, 可以指定最大进程数, 当有任务时, 就在进程池中开辟一个进程, 直到进程池满, 当在有任务时, 任务等待进程池中某任务完成在继续
# 进程池
form multiprocessing import Pool
pool = Pool(Max)
pool.apply() # 阻塞式
pool.apply_async() # 非阻塞式
pool.close() # 停止添加进程
pool.join() # 让主进程让步, 避免主进程死亡,导致子进程死亡
# 非阻塞式: 全部添加到队列中, 主进程立刻返回, 并没有等待其他进程完毕, 但是回调函数时等待任务完成之后才调用
# 阻塞式: 每运行一个添加一个, 上一个完成创建新的线程继续下一个, 线程依然会服用
pool.apply_async(task, args=(i,), callback=callback_print)
函数 参数 回调函数 函数
5.进程间通信
from multiprocessing import Queue
q = Queue(5) # 队列, 我理解为一个列表, 只能存五个元素
q.put("A") # 添加一个元素
q.qsize() # 相当于len, 查看长度
q.full(): # 判断队列是否满
q.empty() #判断队列是否是空的
q.put(6, timeout=3) # timeout设置时间, 超时退出 put() 如果queue满了则只能等待, 直到有空位置.
# 获取队列的值
q.get(timeout=2) # 取内容
q.put_nowait() # 不阻塞的存储
q.get_nowait() # 不阻塞的取 都会抛出异常
# 用法
# 创建线程的时候当参数传进函数, 一个存, 一个取