标签:状态 put syn 空闲 进程调度 互斥 ble pool 线程池
针对单核,实现并发
内存中存放多道程序
看起来多个程序同时运行
实际上多道程序轮流使用CPU
内存中同时存放多道程序
先来先服务:长作业有利,短作业无利
短作业优先:短作业优先度高,不利于长作业
时间片轮转法:将CPU处理时间切成时间片,进程用完时间片还没执行完,就排到末尾等待下一次执行
多级反馈队列:设置多个队列,赋予优先级
4.1 新进程进入内存,放入第一队列,按照先来先服务调度
4.2 不能在分配的时间片内完成,降入第二队列,按照先来先服务调度
依次降级时,按时间片轮转法运行
进程调度:按照多级反馈队列+时间片轮转调度
并发:看起来像同时运行
并行:真正意义上的同时运行
单核计算机不存在并行,但可以并发
from multiprocessing import Process
p=Process(target=func,)
p.start()
p1.join
p.daemon=True
僵尸进程:
1.1 子进程死亡,父进程没回收
1.2 任何进程都会变成僵尸进程
孤儿进程:父进程意外死亡
等待子进程结束再往下进行
acquire()枪锁
release()释放锁
多个进程修改同一个数据时,用锁
1.1 牺牲速度,保证数据安全
1.2 可能造成死锁,效率低
IPC通信机制:队列+管道
2.1进程队列
Queue
JoinableQueue
get、put、full、empty、get_nowait
2.2生产者消费者模型
生产者: 生产/制造数据
消费者: 消费/处理数据
解决了什么问题: 供需不平衡
怎么解决:
通过一个阻塞队列,生数据,取数据都通过这个容器
使用队列Queue
使用JoinableQueue
task_done
join
from multiprocess import pol
p=Pool(3) 创建三个进程
同步调用:res=p.apply(work,args=(i,))
异步调用:
- poll.map(func,range(100))
poll.map(work,[(1,2),‘alex‘]) :map自带join
(带可迭代参数,异步调用进程,开启100个任务,map自带join的功能)
- res=p.apply_async(work,args=(i, ))
(带其他参数)
开启和销毁进程,开销大
from threading import Thread
继承Thread,重写run 方法
t=Thread(targs=sayhi,args=(‘太白‘,))
一个进程内存在多个线程
多线程无法利用多核优势,为什么要有多线程
计算密集型
单核:使用多线程
多核:使用多进程
IO密集型
单核:使用多线程
多核:使用多线程
当线程需要通过判断另一个线程的状态才能执行(下一步的时候使用)
进程:资源单位
线程:执行单位
协程:单线程实现并发(程序员YY出来的概念)
遇到IO操作时,程序员自己检测IO并用代码切换,欺骗操作系统,让他误以为你没有IO这个操作
使用gevent模块
monkey.path_all()需要手动配置
g=spawn(任务名):能够识别IO
g.join()等待任务结束
本质:切换+保存状态,开起来像同时运行
效率:
等待主进程(主线程)运行完毕,才能被销毁
守护进程:运行完毕指的是主进程运行完毕
守护线程:运行完毕指的是主进程所在的进程内,所有其他非守护线程运行完毕
目的:保护数据安全,当多个进程或多个线程需要修改同一份数据时要用到锁
限制任意时刻只有一个线程执行,防止多个线程修改同一份数据
from concurrent.futures import 1/2
线程池:pool=ThreadPoolExecute(5),参数不传默认CPU个数乘以5
提交任务
同步:两个任务提交,必须第一个完成后第二个才能开始
异步:两个任务提交,必须等待第一个完成才能开始第二个
异步回调:pool.submit(任务,任务参数).add_done_callback(callback回调函数)
pool.shutdown 等待池子中所有代码运行完毕才会往下执行
标签:状态 put syn 空闲 进程调度 互斥 ble pool 线程池
原文地址:https://www.cnblogs.com/zhulipeng-1998/p/11743046.html