zoukankan      html  css  js  c++  java
  • Python——协程


    协程

    • 比线程更小的执行单元(微线程)
    • 一个线程作为一个容器里面可以放置多个协程
    • 只切换函数调用即可完成多线程,可以减少CPU的切换
    • 协程自己主动让出CPU
      安装模块: pip3 install greenlet
    
    协程:
    
    这个概念是程序员自己定义的;
    
    它的作用是:单线程下实现并发的效果;
    
    当程序遇到I/O的时候,我们通过自己写的代码,让我们的代码自动完成切换,即让我们的代码监听I/O,一旦遇到I/O,代码层面自动的切换,实现并发的效果;
    
    
    
    
    
    
    from greenlet import greenlet
    import time
    def t1():
        while True:
            print("........A........")
            gr2.switch()
            time.sleep(1)
    def t2():
        while True:
            print("........b........")
            gr1.switch()#调到上次执行的地方继续执行
            time.sleep(1)
    gr1 = greenlet(t1)#创建一个greenlet对象
    gr2 = greenlet(t2)
    gr1.switch()#此时会执行1函数
    
    • python还有一个比greenlet更强⼤的并且能够自动切换任务的模块 gevent
    • 原理是当一个greenlet遇到IO(指的是input output 输⼊输出)操作时, 比如访问网络,
      就自动切换到其他的greenlet, 等到IO操作完成, 再在适当的时候切换回来继续执行
    • 进程线程的任务切换是由操作系统自行切换的,你自己不能控制
    • 协程可以通过自己的程序(代码)来进行切换,自己能够控制
    • gevent只有遇到模块能够识别的IO操作的时候,程序才会进行任务切换,实现并发效果,如果所有程序都没有IO操作,那么就基本属于串行执行了
    • gevent是第三方库,通过greenlet实现协程,其基本思想是:当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO
    import gevent
    def A():
        while True:
            print(".........A.........")
            gevent.sleep(1)#用来模拟一个耗时操作
            #gevent中:当一个协程遇到耗时操作会自动交出控制权给其他协程
    def B():
        while True:
            print(".........B.........")
            gevent.sleep(1)#每当遇到耗时操作,会自用转到其他协程
    g1 = gevent.spawn(A) # 创建一个gevent对象(创建了一个协程),此时就已经开始执行A
    g2 = gevent.spawn(B)
    g1.join()  #等待协程执行结束
    g2.join()  #会等待协程运行结束后再退出
    

    总结:

    • 比线程跟小的执行单元,进程线程是操作系统调度的基本单位,协程是由用户控制的,协程记录上一次的执 行状态。

    • 协程主动让出cpu

    总结:

    协程:

    这个概念是程序员自己定义的;

    它的作用是:单线程下实现并发的效果;

    当程序遇到I/O的时候,我们通过自己写的代码,让我们的代码自动完成切换,即让我们的代码监听I/O,一旦遇到I/O,代码层面自动的切换,实现并发的效果;

    1.线程是CPU调度的基本单位,进程线程的任务切换是由操作系统自行切换的,协程的调度由用户控制
    2.一个线程.进程可以有多个协程。
    3.协程能保留上一次的调用状态。
    4.CPU密集型用进程,I/O密集型用多线程

    补充知识:
    new 和__init__ 区别:
    内置函数:new先执行:用来开辟空间,init用来做一些初始化的工作

    在python中while循环与for 循环的区别
    while 循环
    for 循环 循环可迭代对象

    有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 想到与得到中间还有两个字——做到。
  • 相关阅读:
    jQuery EasyUI API 中文文档 数字框(NumberBox)
    jQuery EasyUI API 中文文档 数值微调器(NumberSpinner)
    jQuery EasyUI API 中文文档 日期时间框(DateTimeBox)
    jQuery EasyUI API 中文文档 微调器(Spinner)
    jQuery EasyUI API 中文文档 树表格(TreeGrid)
    jQuery EasyUI API 中文文档 树(Tree)
    jQuery EasyUI API 中文文档 属性表格(PropertyGrid)
    EntityFramework 数据操作
    jQuery EasyUI API 中文文档 对话框(Dialog)
    jQuery EasyUI API 中文文档 组合表格(ComboGrid)
  • 原文地址:https://www.cnblogs.com/huoxc/p/13304403.html
Copyright © 2011-2022 走看看