python并发编程(二):协程

'''
协程:
1. 协程的定义:
1) 是一种用户态的轻量级线程, 即协程是由用户程序自己控制调度的
2) 是一种协作而非抢占式的处理并发方式, A --> B ---> A --> C
3) 协程的切换属于程序级别的, 操作系统不需要切换

2. 协程的特点:
1) 协程本身是一个线程, 是用户态的切换
2) 相比线程优点:
1> 切换没有消耗
2> 修改共享程序不需要加锁
3) 相比线程缺点:
一旦引入协程,就需要检测单线程下所有的IO行为, 实现遇到IO就切换,少一个都不行,因为一旦一个任务阻塞了,整个线程就阻塞了

3. 并发要求:
1) 要控制多个任务之间的切换
2) 切换之前要把当前任务状态保存下来 (yield, greenlet无法检测IO)
3) 可以自动检测IO操作, IO阻塞下发生切换 (geven可以检测IO)
''' # 协程

'''
协程实现:
1. 生成器: yield, next(g), g.send(value)
用法:
yield # 可以保存状态
g = generator() # 创建生成器
next(g) # 检测到最近yield位置, 执行yield之前的代码
g.send(value) # 检测当前yield的位置,把值通过该yield传入,执行下一个yield到该yield之间的代码, 然后返回

2. greenlet: 使任意函数变为生成器
用法:
g = greenlet.greenlet(fun) # 将函数包装为生成器
g.switch(*args,**kwargs) # 在一个函数中切换到fun

3. gevent: 可自动完成IO阻塞切换
用法:
1) g = gevent.spawn(func,*args,**kwargs) # 相当于创建了一个虚拟线程对象, 可自动识别IO阻塞
# 协程创建时就已经运行了

2) 若要gevent识别其他类型阻塞, 必须在导入该模块前打补丁
from gevent import monkey;monkey.patch_all()

3) g.join() # 协程加入主线程(真实线程)
gevent.joinall([]) # 线程可能出现协程还没执行完, 线程就结束了, 所有协程必须join到主线程

4) g.value # 获取协程返回值

gevent实现单线程socket并发: Gevent_Server.py
''' # 协程实现

转载于:https://www.cnblogs.com/lancelotxly/p/10843611.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值