• 协程


    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可以有多个连接,  利用循环可以多次创建, 保存连接可以触发多对一的服务 

     

        

      

  • 相关阅读:
    分布式配置中心选型
    springboot中后端返回数据给前端的设计模式
    java中泛型在静态方法中的使用
    java在开发中DO、DTO、BO、AO、VO、POJO定义
    linux中find命令的使用详解(转载)
    Centos7配置ssh免密登录群发
    关于oracle PL/SQL存储过程 PLS-00905 object is invalid,statement ignored问题的解决
    Django-ModelFrom中修改save后的字段值
    MongoDB的集群模式--Sharding(分片)
    MongoDB用户和密码登录
  • 原文地址:https://www.cnblogs.com/tcpblog/p/9879380.html
Copyright © 2020-2023  润新知