协程 *单线程实现并发


 进程:资源单位
 线程:执行单位
 协程:单线程下实现并发
            并发:切换 + 保存状态
            ps:看起来像同时执行的就可以称之为并发


 协程:完全是程序员自己意淫出来的名词
            单线程下实现并发
 

 并发的条件?
      多道技术:
           空间上的复用
         时间上的复用
              切换 + 保存状态
 

实现解释:
   程序员自己通过代码自己 检测程序中的IO
   一旦遇到IO自己通过代码 自动切换
   给操作系统的感觉是你这个线程没有任何的IO

  ps:欺骗操作系统,让它误认为你这个程序一直没有IO从而保证程序在 运行态和就绪态来回切换,提升代码的运行效率

 

  如何检测 IO ???

    导入模块:from gevent import spawn

         注意:gevent 模块没办法自动识别 time.sleep 等IO情况

            需要你手动再配置一个参数 from gevent import monkey; monkey.patch_all()

 

# 以协程实现服务端并发为例:
import
socket from gevent import spawn from gevent import monkey; monkey.patch_all() #  # 由于该模块经常被使用 所以建议写成一行 def run(conn): while True: try: data = conn.recv(1024) print(data.decode('utf-8')) conn.send(data.upper()) except ConnectionResetError as e: print(e) break conn.close() server = socket.socket() server.bind(('127.0.0.1', 8083)) server.listen(5) def server1(): while True: conn, addr = server.accept() spawn(run, conn) # 直接执行 if __name__ == '__main__': g1 = spawn(server1) # spawn会检测所有的任务 有一个返回值 可以使用join方法 不然 spawn()里的函数就直接执行 g1.join()

 

 ################################################### 

  切换 + 保存  状态就一定能够提升效率吗???分情况讨论:


       当你的任务是 IO密集型 的情况下 >>> 提升效率
       如果你的任务是 计算密集型 的 >>> 降低效率

####################################################

posted @ 2019-08-19 16:04  速8赛亚人  阅读(151)  评论(0编辑  收藏  举报