协程

1, 协程:  cpu遇到i/o阻塞自动切换执行任务,  为了使得python程序运行效率高 , 更大化的使用cpu,  加入协程,  识别程序的i/o 事件, 自动切换到其他任务去执行

  优点1, 开销小, 减少cpu切换时间, 程序自动切换, 操作系统无法感知, 从而不再切换其他线程,

    2, 单线程内实现并发 效果,  利用了更多cpu资源

  缺点 1, 协程 的本质是单线程, 无法利用多核,  解决方案: 开启多个进程, 每个进程开启多个线程, 单个线程内使用协程

特点: 1,  必须只有一个单线程才能实现并发

    2,  修改共享数据不需要加锁,  单线程执行代码是逐行执行的, 全程属于串行

    3,  用户程序里自己保持多个控制流的上下文栈

2 . greemlet:  实现了程序代码执行的切换顺序,  并不能检测到 程序的io阻塞事件,  因而不能高效 的利用io时间

def p1(c):

  print("a", c )

  g2.switch("二货")

  print("b", c)

  g2.switch()

def p2(d):

  pirnt("c", d)

  g1.switch()

  print("d", d)

  g1.switch()


g1=greenlet(p1)
g2=greenlet(p2)

g1.switch("二货")

tip  : switch 可以启动执行,  并且里面可以传参, 一次输入,  后续的线程 里面 同一类g1  或者g2  只需要第一次传参即可

3 gevent  : 利用了greenlet模块  ,  可以感知程序里面的io事件,  实现自动切换    需要加 monkey,  monkey.patch_all() 才能识别

   gevent.spawn(func,  *args, **kwargs)   #   创建单线程,  执行函数,  多个 spawn  组成一个单线程 , join()启动执行

   g1 = spawn(fun1,  1)

   g1.join()

   join需要加上, 否则 执行时间过长时,  其他任务结束了 ,他也跟着结束,  导致执行不完整

   统一 加join   joinall([协程任务   ]) 

   返回值  g1.value()

   spawn()执行是异步的,  自动切换顺序

socket   #  今天才知道 ,   listen () 之后, accept可以有多个连接,  利用循环可以多次创建, 保存连接可以触发多对一的服务 

 

    

  

原文地址:https://www.cnblogs.com/tcpblog/p/9879380.html