**
协程
**
- 定义
纤程,微线程,是为非抢占式多任务产生子程序的计算机程序组件 - 特点
- 协程允许在不同的位置暂停或者开始执行,简单来说,协程就是可以暂停执行的函数
- yield是实现协程的基本关键字(生成器就是协程的基本体现)
- 原理
- 记录一个函数栈的上下文,进行协程的切换调度,当一个函数暂停执行时,会将上下文栈帧保存起来
- 优点
- 可执行多任务
- 本质是单线程,资源消耗小
- 协程无需切换的开销,无需同步互斥(无需内核切换,只是应用层的切换)
- 缺点
无法利用计算机多核资源 - 协程模块
- 第三方模块 : greenlet gevent
- 安装
sudo pip3 install greenlet
sudo pip3 install gevent - greenlet模块方法
- g = greenlet.greenlet(func)
功能 : 创建协程对象
参数 : 协程函数 - g.switch()
功能 : 启动协程函数 - gevent模块
- gevent.spawn(func,argv)
- 功能 : 生成协程对象
- 参数 : func协程函数,argv传参
- 特点 : 当func中遇到gevent类型阻塞会跳出
## 并不是所有类型的阻塞都会跳出
- gevent.joinall(List,[timeout])
- 功能 : 启动并阻塞等待回收协程
- 参数 : List为协程对象列表,timeout为超时时间
- gevent.sleep(sec)
- 功能 : 提供协程阻塞
- from gevent import monkey
monkey.patch_all()
功能 : 修改原有IO阻塞行为,触发协程事件跳转
特点 : 必须在导入要使用的模块前设置
5.协程的TCPServer(并发) - 集成模块完成多进程,多线程socket并发
- 模块
- python2 : SocketServer
- python3 : socketserver
- 功能
通过模块提供的不同类的组合,完成多进程或者多线程并发 - 常用类
‘StreamRequestHandler’,
‘DatagramRequestHandler’,
'TCPServer',
'UDPServer',
'ForkingMixIn',
'ForkingTCPServer',
'ForkingUDPServer',
'ThreadingMixIn',
'ThreadingTCPServer',
'ThreadingUDPServer',
- 示例代码
‘’‘创建多进程的TCP并发’’’
from socketserver import *
# 创建服务器类,TCP+多进程并发
# Python支持多继承
class Server(ForkingMixIn,TCPServer):
pass
# 创建处理请求类,继承
class Handler(StreamRequestHandler):
# 重写handle方法
def handle(self):
# client_address属性: 客户端地址
print(self.client_address,'连接过来了')
while True:
# 属性 : self.request --> 套接字
data = self.request.recv(1024)
if not data:
break
print(data.decode())
self.request.send('服务器收到'.encode())
# 创建服务器对象,第二个参数指定由哪个类去处理客户端请求
server = Server(('0.0.0.0',8888),Handler)
# 启动
server.serve_forever()
- 使用socketserver流程
- 创建服务器类(Python支持多继承)
- 通过选择继承模块中的TCPServer或者UDPServer,确定服务器类型
- 继承多进程或者多线程类确定并发类型
- 创建请求处理类
根据服务器类型选择集成流式套接字还是数据报套接字 - 重写请求处理类的handle方法
- 通过服务器类创建服务器对象,并绑定请求处理类
server = Server((‘0.0.0.0’,8888),Handler) - 通过服务器对象调用serve_forever()启动服务端
server.serve_forever() - 当客户端发起请求后,会自动调用请求处理类中的handle()方法去处理