zoukankan      html  css  js  c++  java
  • 协程 *单线程实现并发


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

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

  • 相关阅读:
    java:字符串的split方法,使用多个分隔符,分割一个字符串
    mysql 导入txt数据到数据表【原创】
    配置SSH无密码登录【原著】
    springboot 控制台程序读取配置文件(原创)
    Idea开发环境中,开发springboot类型的项目,如果只引入parent节点,不添加依赖节点,maven是不会加载springboot的任何依赖的
    Windows版的OpenJDK下载(Red Hat 提供)
    谈谈php里的IOC控制反转,DI依赖注入(转)
    高质量的工程代码为什么难写 (转)
    系统权限管理设计 (转)
    php mqtt client
  • 原文地址:https://www.cnblogs.com/pupy/p/11377721.html
Copyright © 2011-2022 走看看