Python学习第十五天——并发编程
作者:互联网
发展史:
1.手工操作——穿孔卡片
2.批处理
①.联机批处理
②.脱机批处理
3.多道程序设计技术
遇到I/O操作时,CPU执行其他程序
4.分时系统
时间片
5.通用操作系统
多道批处理、分时
进程:
为什么要有进程?
程序:二进制文件(硬盘)
进程:二进制文件(内存)+ PCB(task_struct)
缺点: 1.进程只能在一个时间干一件事情,如果想同时干两件事或多件事,进程就无能为力了。
2.进程在执行的过程中如果阻塞,列入等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也无法执行
线程:让一个线程执行一个子任务,这样一个进程就包含了多个线程。每个线程负责一个单独的子任务。
狭义定义:进程是正在运行的进程的实例
广义定义:进程是一个具有一定独立功能的程序关于某一数据集合的依次运行活动。
进程是资源分配的最小单位。线程是运行(系统调度)的最小单位。
一个程序运行最少有一个进程,一个进程里最少有一个线程。
理解:
与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程
进程的状态:
就绪态:可以被CPU执行,但没有被执行
运行态:运行中
阻塞态:I/O操作,把数据加载到内存中
并发和并行:
并发:时间段
并行:同一时刻
## 进程调度算法
1.先来先服务
2.短作业优先
3.时间片轮转算法
4.多级反馈队列
同步、异步描述别人(调用对象)
阻塞、非阻塞描述自己(自己状态)
四类:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞
Process
形参:
group参数未使用,值始终为None
target表示调用对象,即子进程要执行的任务
args表示调用对象的位置参数元组,args=(1,2,'egon',)
,位置实参
kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
,关键字实参
name为子进程的名称
方法:
p是对象不是进程。
p.start() #启动进程,必须调用start
p.run() #实际进程在执行时,执行的是run方法,但是调用run不会开进程,后面我们另一种开启进程方案提及
p.join() # 等待子进程执行完成
p.terminate() # 杀死p进程,并不是立即结束而是通知系统。
p.is_alive() #看进程是否活着
属性:
p.name #进程的名字
p.pid #进程号
p.daemin = True #主进程结束,子进程也结束。默认False ,必须在start之前调用.
如果在任务中取出进程id号,需要使用os模块
print(os.getpid()) #子进程id号(自己的)
print(os.getppid()) #父进程id号
Queue
实例化得到一个对象
queue = Queue(3)
queue.put()
block 是否阻塞 默认为True
timeout 等待时间
queue.get()
block 是否阻塞
timeout 等待时间
相当于block = False
queue.put_nowait()
queue.get_nowait()
判断队列是否为满
queue.full()
判断队列是否为空
queue.empty()
查看queue中有多少值
queue.qsize()
python因为自身的原因需要引入进程。GIL锁,一个cpu同一时刻只能运行一个线程
全局解释器锁(GIL)
动态语言问题,无需编译,不可预知参数是否还会使用,导致GC机制,需要加锁。
1.pypy(没有全局解释器锁)快 但是好多模块无法使用
2.cpython
只针对cpython解释器
如果是计算密集型:需要进程
如果是I/O密集型:要开线程
标签:调用,Python,编程,阻塞,queue,线程,进程,执行,第十五天 来源: https://blog.csdn.net/m0_43424160/article/details/116123147