zoukankan      html  css  js  c++  java
  • 协程

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

     

        

      

  • 相关阅读:
    export、export default 和 exports、module.exports 的区别
    RunJS JavaScript及时运行调试工具
    vuecli 中的devServer配置代理
    vue使用pinyin的npm包将文字转为大写首字母
    vue阻止事件冒泡和默认事件
    解决Elementu的 elform 使用 vif校验失灵问题
    calc()使用方法
    element ui 中的 resetFields() 报错'resetFields' of undefined
    vux中的 scroller 组件,在iOS13上,一停止滑动就跳到顶部问题
    elementui的input加单位符号
  • 原文地址:https://www.cnblogs.com/tcpblog/p/9879380.html
Copyright © 2011-2022 走看看