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 循环 循环可迭代对象

    有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 想到与得到中间还有两个字——做到。
  • 相关阅读:
    《BI那点儿事》数据流转换——聚合
    《BI那点儿事》数据仓库建模:星型模式、雪片模式
    《BI那点儿事》Cube的存储
    《BI项目笔记》创建多维数据集Cube(2)
    《BI项目笔记》增量ETL数据抽取的策略及方法
    类对象切割对虚函数调用的影响
    类对象切割对虚函数调用的影响
    显示调用析构函数潜在隐患分析
    显示调用析构函数潜在隐患分析
    PeekMessage和GetMessage函数的主要区别
  • 原文地址:https://www.cnblogs.com/huoxc/p/13304403.html
Copyright © 2011-2022 走看看