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

有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 想到与得到中间还有两个字——做到。
原文地址:https://www.cnblogs.com/huoxc/p/13304403.html