- 主要概念
- 正在进行的过程或任务
- 单核+多道,实现多进程并发执行
- 并发与并行
- 并行:同时运行,只有具备多个cpu才能实现并行
- 并发:伪并行,看起来是同时运行,单个cpu+多道技术。也属于并发
- 同步与异步
- 针对的是函数/任务的调用方式
- 同步:就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态
- 异步:是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成
- 阻塞与非阻塞
- 针对的是进程或线程
- 阻塞:是当请求不能满足的时候就将进程挂起
- 非阻塞:则不会挂起(阻塞)当前进程
- 层次结构
- Windows 所有进程地位相同,没有层次概念
- Unix/Linux 以init为根的树形结构
- 状态
- 运行
- 阻塞
- 就绪
- 正在进行的过程或任务
- 进程操作
- 系统初始化,进程中开启子进程
- subprocess()
- os.fork()
- 开启方式
- from multiprocessing import Processing
- p = Processing(target=func,args=(a,)) ; p.start()
- 继承Process类,实现run()方法
- Windows下需要在 if __name__ == '__main__'下
- 查看进程ID
- os.getpid()
- 父进程ID:os.getppid()
- 进程关系
- 串行 join
- 主进程等待子进程结束 p.join()
- 守护进程daemon
- 主进程不等待子进程 p.daemon = True
- 守护进程内无法再开启子进程
- 僵尸进程
- 有害
- 子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中
- p.is_alive() ; p.terminate()
- 孤儿进程
- 无害
- 父进程退出,而它的一个或多个子进程还在运行
- 被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作
- 串行 join
- 系统初始化,进程中开启子进程
- 进程同步
- 进程之间数据不共享
- 互斥(同步)锁
- 由并发变成了串行,牺牲了运行效率,但避免了竞争
- from multiprocessing import Process,Lock
- lock=Lock();lock.acquire();lock.release()
- 效率低(共享数据基于文件,而文件是硬盘上的数据)
- 需要自己加锁处理
- 进程通信IPC
- 队列
- 底层是管道和锁定
- Queue 先进先出
- from multiprocessing import Process,Queue
- q.put(block=True,timeout=3)
- q.get(block=True,timeout=3)
- 生产者消费者模型
- 通过容器,解决生产数据和处理数据强耦合问题,平衡生产者和消费者的处理能力
- 通过阻塞队列进行通讯,生产者put数据,消费者get数据
- 发送结束信号 JoinableQueue
- 允许数据的使用者通知生产者数据已处理完
- 通知进程是使用共享的信号和条件变量来实现的
from multiprocessing import Process,Queue import time,random,os def consumer(q): while True: res=q.get() if res is None:break #收到结束信号则结束 time.sleep(random.randint(1,3)) print('
- 底层是管道和锁定
- 队列