Python30期第三十三天课程总结
- 死锁,互斥锁,递归锁
- 进程池和线程池
- 回调函数
- 协程
- 协程的例子
死锁,互斥锁,递归锁
1.死锁: 只上锁不解锁是死锁.
2.递归锁专门用来解决死锁现象,
临时用于快速解决项目因死锁问题不能正常运行的场景
用来处理异常死锁的
3.尽量使用一把锁解决问题,不要互相嵌套,否则容易死锁
事件 Event
1.关键字
wait 动态加阻塞
clear 将阻塞事件的值改成False
set 将阻塞事件的值改成True
is_set 获取阻塞事件的值
2.基本语法
e = Event()
print(e.is_set())
e.set()
e.clear()
e.wait(3)
print("程序在运行 ... ")
3.
线程队列
1.关键字
put 存
get 取
put_nowait 存,超出了队列长度,报错
get_nowait 取,没数据取不出来,报错
2.linux windows 线程中put_nowait,get_nowait都支持
3.Queue:先进先出,后进后出
3.LifoQueue 先进后出,后进先出(按照栈的特点设计)
4.PriorityQueue 按照优先级顺序排序 (默认从小到大排序)
5.如果都是数字,默认从小到大排序
6.如果是字符串,按照ascii编码排序
7.要么全是数字,要么全是字符串,不能混合
进程池和线程池
1.ProcessPoolExecutor 进程池基本使用
默认如果一个进程短时间内可以完成更多的任务,就不会创建额外的新的进程,以节省资源\
2.ThreadPoolExecutor 线程池的基本用法
默认如果一个线程短时间内可以完成更多的任务,就不会创建额外的新的线程,以节省资源
3.线程池 map
回调函数
1.回调函数:
把函数当成参数传递给另外一个函数
在当前函数执行完毕之后,最后调用一下该参数(函数),这个函数就是回调函数
2.功能:
打印状态: a属性
支付状态: b属性
退款状态: c属性
转账的状态: d属性
把想要的相关成员或者相关逻辑写在自定义的函数中
支付宝接口在正常执行之后,会调用自定义的函数,来执行相应的逻辑
那么这个函数就是回调函数
3.进程池的回调函数: 由主进程执行调用完成
4.线程池的回调函数: 由当前子线程执行调用完成
协程
1.安装协程模块 gevent
2.用协程改成一下生产者消费者模型
def producer():
# 数据范围0 ~ 999
for i in range(1000):
yield i
def counsumer(gen):
for i in range(10):
print(next(gen))
# 初始化生成器函数
gen = producer()
counsumer(gen)
counsumer(gen)
counsumer(gen)
3.协程的具体实现
switch 遇到阻塞时,只能手动调用该函数进行函数切换,不能自动实现切换,来规避io阻塞
4.gevent
gevent 可以自动切换,但是不能够自动识别time.sleep这样的阻塞
5.gevent.time 添加阻塞,让他实现自动切换
6.终极大招 彻底解决不识别阻塞的问题
from gevent import monkey
monkey.patch_all() # 把下面所有引入的模块中的阻塞识别一下
import time
import gevent
def eat():
print("eat 1")
time.sleep(3)
print("eat 2")
def play():
print("play one")
time.sleep(3)
print("play two")
# 利用gevent.spawn创建协程对象g1
g1 = gevent.spawn(eat)
# 利用gevent.spawn创建协程对象g2
g2 = gevent.spawn(play)
# 阻塞,必须g1协程执行完毕为止
g1.join()
# 阻塞,必须gg协程执行完毕为止
g2.join()
print("主线程执行完毕 ... ")
协程的例子
1.语法
(1) spawn(函数,参数1,参数2,参数3 .... ) 启动协程
(2) join 阻塞,直到某个协程任务执行完毕之后,再放行
(3) joinall 等待所有协程任务都执行完毕之后,在放行
g1.join() g2.join() <=> gevent.joinall( [g1,g2] )(推荐:比较简洁)
(4) value 获取协程任务中的返回值 g1.value g2.value 获取对应协程中的返回值
2.语句和语句之间可以用分好;隔开写在一行
3.利用协程爬取数据
requests 抓取页面数据模块
4.HTTP 状态码
200 ok
404 not found
400 bad request
5.利用好多进程,多线程,多协程可以让服务期运行速度更快,
并且也可以抗住更多用户的访问