zoukankan      html  css  js  c++  java
  • 协程简介

    协程简介

    进程是资源单位,线程是执行单位,这两者是实际存在的。对于协程,程序员为了解决单线程下IO阻塞的问题,自己定义的。在单线程下,协程通过切换程序以及保存状态的操作,让多个程序看起来是同时执行的,表现出没有IO阻塞的状态。

    程序员自己通过代码检测自己写的程序中的IO,一旦遇到IO程序通过代码自己切换,欺骗了操作系统,让操作系统认为这个线程没有IO,保证程序在运行态和就绪态之间来回切换,提升了代码的运行效率。

    上述过程的实现是通过切换加保存运行状态的操作实现,但是在该操作下代码的运行效率不一定提升。在密集IO操作下该方法可以提高程序运行效率,但是在计算密集型下代码效率会大大降低。

    在python中,yield可以保存上一次的运行状态。上述方法就是基于yield实现的。

    为了方便使用,程序员将该方法封装成gevent包,并将该方法命名为协程。

    from gevent import monkey;monkey.patch_all()  # 由于该模块经常被使用 所以建议写成一行
    from gevent import spawn
    import time
    """
    注意gevent模块没办法自动识别time.sleep等io情况
    需要你手动再配置一个参数
    """
    
    def heng():
        print("")
        time.sleep(2)
        print('')
    
    def ha():
        print('')
        time.sleep(3)
        print('')
    
    def heiheihei():
        print('嘿嘿嘿')
        time.sleep(5)
        print('嘿嘿嘿')
    
    start = time.time()
    g1 = spawn(heng)
    g2 = spawn(ha)  # spawn会检测所有的任务,当遇到IO时,spawn会及时切换程序
    g3 = spawn(heiheihei)
    g1.join()
    g2.join()
    g3.join()
    
    print(time.time() - start)  # 5.0002686977386475


  • 相关阅读:
    《c程序设计语言》读书笔记--大写转小写
    《c程序设计语言》读书笔记--字符串比较
    《c程序设计语言》读书笔记--反转字符串
    spring接收json字符串的两种方式
    logback的使用
    初识Vim
    Chrome控制台
    构造有层次的大纲
    让chrome浏览器快的不要不要的
    排序算法Java版
  • 原文地址:https://www.cnblogs.com/le-le666/p/11358062.html
Copyright © 2011-2022 走看看