协程:
  1.协程,又称微线程,纤程。英文名Coroutine。
  2.协程是跑在线程内的单线程,串行没有锁。
  3.协程是一种用户态的轻量级线程。
  4.协程CPU是访问不到的,协程是用户自己控制的。
 
  协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。
  协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。
协程特点:
  1. 必须在只有一个单线程里实现并发
  2. 修改共享数据不需加锁
  3. 用户程序里自己保存多个控制流的上下文栈
  4. 一个协程遇到IO操作自动切换到其它协程
协程优点:
  • 无需线程上下文切换的开销
  • 无需原子操作锁定及同步的开销
  • 方便切换控制流,简化编程模型
  • 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。
    "原子操作(atomic operation)是不需要synchronized",所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱,或者切割掉只执行部分。视作整体是原子性的核心。 
 
 
协程缺点:
  • 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。
  • 进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
协程处理并发数据:
  当协程处理并发的请求时,由于协程是单线程串行,他只要遇到数据请求IO操作时就会切换到另一个请求链接内,当第一个IO处理完成时,在切换回第一个请求。
 
  • 使用yield实现协程并发例子
import time
import queue def consumer(name):
print("--->starting eating baozi...")
while True: # yield可以返回数据,可以接收数据
new_baozi = yield
print("[%s] is eating baozi %s" % (name,new_baozi)) def producer(): # 加入_next__执行
# 函数内有yield首次调用会是一个生成器
r = con.__next__()
r = con2.__next__()
n = 0
while n < 5:
n +=1 # send唤醒生成器的同时生成一个yield值
con.send(n)
con2.send(n)
print("\033[32;1m[producer]\033[0m is making baozi %s" %n ) if __name__ == '__main__':
con = consumer("c1")
con2 = consumer("c2")
p = producer()
  • 调用协程手动切换数据:
  greenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator。
# greenlet封装好的协程
from greenlet import greenlet def test1():
print(12)
gr2.switch()
print(34)
gr2.switch() def test2():
print(56)
gr1.switch()
print(78) # 启用两个协程调用两个函数。
gr1 = greenlet(test1)
gr2 = greenlet(test2) # 手动切换
gr1.switch()

最新文章

  1. 使用二级域名访问本地localhost网站
  2. 【转】Java集合类
  3. monkeyrunner之eclipse中运行monkeyrunner脚本之环境搭建(四)
  4. systemctl 取代 service
  5. phpstorm 实用快捷键 和 注释
  6. cas单点登录用户名为中文的解决办法
  7. 如何借助浏览器Console使用Js进行定位和操作元素
  8. 3、网页制作Dreamweaver(表单form)
  9. Centos6下DRBD的安装配置
  10. Unity3D 游戏开发构架篇 —— 动态大场景生成 = 区域加载+对象池管理
  11. Xcode中如何启用或禁用某些文件的ARC
  12. NPOI实现Excel导入导出
  13. API练习_图形
  14. DLL生成与使用的全过程
  15. 项目实战9—企业级分布式存储应用与实战MogileFS、FastDFS
  16. SOJ--Zig-Zag
  17. Homework 7 INF 552
  18. Scala隐式参数
  19. AICODER官方小程序和公众号上线了
  20. onload事件

热门文章

  1. 将ubuntu的home迁移至第二块磁盘
  2. C#Windows Service程序的创建安装与卸载
  3. [学习笔记]nodejs全局安装和本地安装的区别
  4. 使用AS-REP Roasting和kerberoasting攻击kerberos
  5. Vue中axios踩坑之路-POST传参
  6. HTML load事件和DOMCOntentLoaded事件
  7. Listen error 错误和 limit of inotify watches was reached
  8. php const常量 不能使用字符串连接符.链接
  9. java_工厂模式
  10. [bash] 几个以前没注意过的小知识