Python30期第三十三天课程总结

Python30期第三十三天课程总结

  • 死锁,互斥锁,递归锁
    • 事件 Event
      • 线程队列
  • 进程池和线程池
  • 回调函数
  • 协程
  • 协程的例子

死锁,互斥锁,递归锁

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.利用好多进程,多线程,多协程可以让服务期运行速度更快,
  并且也可以抗住更多用户的访问

你可能感兴趣的:(Python30期第三十三天课程总结)