协程

**

协程

**

  1. 定义
    纤程,微线程,是为非抢占式多任务产生子程序的计算机程序组件
  2. 特点
  3. 协程允许在不同的位置暂停或者开始执行,简单来说,协程就是可以暂停执行的函数
  4. yield是实现协程的基本关键字(生成器就是协程的基本体现)
  5. 原理
  6. 记录一个函数栈的上下文,进行协程的切换调度,当一个函数暂停执行时,会将上下文栈帧保存起来
  7. 优点
  8. 可执行多任务
  9. 本质是单线程,资源消耗小
  10. 协程无需切换的开销,无需同步互斥(无需内核切换,只是应用层的切换)
  11. 缺点
    无法利用计算机多核资源
  12. 协程模块
  13. 第三方模块 : greenlet gevent
  14. 安装
    sudo pip3 install greenlet
    sudo pip3 install gevent
  15. greenlet模块方法
  16. g = greenlet.greenlet(func)
    功能 : 创建协程对象
    参数 : 协程函数
  17. g.switch()
    功能 : 启动协程函数
  18. gevent模块
  19. gevent.spawn(func,argv)
    1. 功能 : 生成协程对象
    2. 参数 : func协程函数,argv传参
    3. 特点 : 当func中遇到gevent类型阻塞会跳出
      ## 并不是所有类型的阻塞都会跳出
  20. gevent.joinall(List,[timeout])
    1. 功能 : 启动并阻塞等待回收协程
    2. 参数 : List为协程对象列表,timeout为超时时间
  21. gevent.sleep(sec)
    1. 功能 : 提供协程阻塞
  22. from gevent import monkey
    monkey.patch_all()
    功能 : 修改原有IO阻塞行为,触发协程事件跳转
    特点 : 必须在导入要使用的模块前设置
    5.协程的TCPServer(并发)
  23. 集成模块完成多进程,多线程socket并发
  24. 模块
    1. python2 : SocketServer
    2. python3 : socketserver
  25. 功能
    通过模块提供的不同类的组合,完成多进程或者多线程并发
  26. 常用类
    ‘StreamRequestHandler’,
    ‘DatagramRequestHandler’,
'TCPServer',
'UDPServer',

'ForkingMixIn',
'ForkingTCPServer',
'ForkingUDPServer',

'ThreadingMixIn',
'ThreadingTCPServer',
'ThreadingUDPServer',
  1. 示例代码
    ‘’‘创建多进程的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()
  1. 使用socketserver流程
  2. 创建服务器类(Python支持多继承)
  3. 通过选择继承模块中的TCPServer或者UDPServer,确定服务器类型
  4. 继承多进程或者多线程类确定并发类型
  5. 创建请求处理类
    根据服务器类型选择集成流式套接字还是数据报套接字
  6. 重写请求处理类的handle方法
  7. 通过服务器类创建服务器对象,并绑定请求处理类
    server = Server((‘0.0.0.0’,8888),Handler)
  8. 通过服务器对象调用serve_forever()启动服务端
    server.serve_forever()
  9. 当客户端发起请求后,会自动调用请求处理类中的handle()方法去处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值