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


  • 相关阅读:
    Mysql数据库基本操作
    Entity Framework 实践系列 —— 搞好关系 单相思(单向一对一,onetoone)
    ADO.NET最佳实践
    C++试题1
    SQL操作(初级、中级、高级)
    存储过程入门与提高
    数据库学习笔记
    触发器设计技巧与实例
    UML在关系型数据库设计中的应用
    数据库设计的一些构想
  • 原文地址:https://www.cnblogs.com/le-le666/p/11358062.html
Copyright © 2011-2022 走看看