学习协程的部分知识

一.概念
协程,又称微线程,纤程,英文名Coroutine。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行。
二.优势
执行效率极高,因为子程序切换(函数)不是线程切换,由程序自身控制,没有切换线程的开销。所以与多线程相比,线程的数量越多,协程性能的优势越明显。
不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在控制共享资源时也不需要加锁,因此执行效率高很多。
三.yield 特点
1、程序遇到yield会暂停,如果yield后面有值,返回结果之后再暂停
2、再次启动生成器,代码从yield之后开始执行
四.参考代码

    #生成器
def work(num):
    a = 0
    b = 1
    current_index = 0
    while current_index < num:
        a,b = b,a+b
        current_index += 1
        yield a,b #程序遇到yield会暂停,如果yield后面有值,返回结果之后再暂停
assignment = work(5)
print(assignment)
print(next(assignment))
print(next(assignment))
print(next(assignment))
print(next(assignment))
print(next(assignment))

五.greenlet#需要手动切换其他协程工作
greenlet的安装很简单:pip install greenlet 即可
是一个更加原始的微线程的概念,但是没有调度,或者叫做协程。这在你需要控制你的代码时很有用。你可以自己构造微线程的 调度器;也可以使用”greenlet”实现高级的控制流。例如可以重新创建构造器;不同于Python的构造器,我们的构造器可以嵌套的调用函数,而被 嵌套的函数也可以 yield 一个值。
六.参考代码

from greenlet import greenlet
import time
def work1():
    for i in range(5):
        print('work1',i)
        time.sleep(0.1)
        g2.switch()
#        手动切换其他协程工作
def work2():
    for i in range(5):
        print('work2',i)
        time.sleep(0.1)
        g1.switch()#手动切换其他协程工作
# 创建协程
g1 = greenlet(work1)
g2 = greenlet(work2)
# 启动协程
g1.switch()
g2.switch()

七.gevent:继续Python协程方面的介绍,这次要讲的是gevent,它是一个并发网络库。它的协程是基于greenlet的,并基于libev实现快速事件循环(Linux上是epoll,FreeBSD上是kqueue,Mac OS X上是select)。有了gevent,协程的使用将无比简单,你根本无须像greenlet一样显式的切换,每当一个协程阻塞时,程序将自动调度,gevent处理了所有的底层细节。
八.参考代码

import gevent
import time
from gevent import monkey
monkey.patch_all()
 # 给所有的耗时操作打上补丁,协程自动切换
def work1():
    for i in range(5):
        print('work1',i)
        time.sleep(0.1)
def work2():
    for i in range(5):
        print('work2',i)
        time.sleep(0.1)
g1 = gevent.spawn(work1)
g2 = gevent.spawn(work2)
 # time.sleep(100)
g1.join()
g2.join()
 # 等待协程操作完成`

猜你喜欢

转载自blog.csdn.net/weixin_42986099/article/details/81871256