首页 > 其他 > 详细

协程简介

时间:2019-08-15 16:06:44      阅读:76      评论:0      收藏:0      [点我收藏+]

 

协程简介

进程是资源单位,线程是执行单位,这两者是实际存在的。对于协程,程序员为了解决单线程下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

 


协程简介

原文:https://www.cnblogs.com/le-le666/p/11358062.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!