协程 *单线程实现并发

这一生的挚爱 提交于 2019-11-27 21:24:24


 进程:资源单位
 线程:执行单位
 协程:单线程下实现并发
            并发:切换 + 保存状态
            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密集型 的情况下 >>> 提升效率
       如果你的任务是 计算密集型 的 >>> 降低效率

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!