zoukankan      html  css  js  c++  java
  • 协程与异步IO

    协程

    协程(Coroutine),又称微线程,纤程,协程是一种用户态的轻量级线程

    协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。

    协程的优点

    1.无需线程上下文切换的开销

    2.无需原子操作锁定及同步的开销

    3.方便切换控制流,简化编程模型

    4.高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理

    缺点

    1.无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。

    2.进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序

    协程的实现

    协程通过yield实现,或者通过其他三方的版本,如Greenlet,Gevent

     1 from greenlet import greenlet
     2 
     3 def test1():
     4     print (12)
     5     gr2.switch()  #使用switch进行切换
     6     print (34)
     7     gr2.switch()
     8 
     9 def test2():
    10     print (56)
    11     gr1.switch()
    12     print (78)
    13 
    14 gr1 = greenlet(test1)
    15 gr2 = greenlet(test2)
    16 gr1.switch()
     1 import gevent
     2 
     3 def foo():
     4     print('33[32;1mRunning in foo33[0m')
     5     gevent.sleep(0)  #遇到阻塞自动切换
     6     print('33[32;1mExplicit context switch to foo again33[0m')
     7 
     8 def bar():
     9     print('Explicit context to bar')
    10     gevent.sleep(0)
    11     print('Implicit context switch back to bar')
    12 
    13 def ex():
    14     print('33[31;1mExplicit context to ex33[0m')
    15     gevent.sleep(0)
    16     print('33[31;1mImplicit context switch back to ex33[0m')
    17 
    18 gevent.joinall([
    19     gevent.spawn(foo),
    20     gevent.spawn(bar),
    21     gevent.spawn(ex),
    22 ])

    事件驱动与异步IO 

    未完待续......

  • 相关阅读:
    JavaScript学习心得(六)
    JavaScript学习心得(五)
    JavaScript学习心得(四)
    JavaScript学习心得(三)
    JavaScript学习心得(二)
    JavaScript学习心得(一)
    socket异步接收信息
    DataTable将行转成列
    highcharts的柱状图边线
    w3cSchool jquery学习
  • 原文地址:https://www.cnblogs.com/yoyovip/p/5796211.html
Copyright © 2011-2022 走看看