Python----多任务----协程

被刻印的时光 ゝ 提交于 2020-02-29 20:49:48

Python学习之路,点击有全套Python笔记

协程是什么

简单点说协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态.

迭代器

迭代器就是用于迭代操作(for 循环的对象),它像列表一样可以迭代获取其中的每一个元素,任何实现了__next__方法的对象都可以称为迭代器。
它与列表的区别在于,构建迭代器的时候,不像列表把所有元素一次性加载到内存,而是以一种延迟计算方式返回元素。它并没有把所有元素装在到内存中,而是等到调用next方法的时候才返回元素

生成器

方法一:把列表生成器的[]改成()
方法二:只要函数里有yield关键字,就被称为生成器
yield关键字有两点作用:
保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起
将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用
可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)
Python3中的生成器可以使用return返回最终运行的返回值。

# 用yield实现协程
import time

def task_1():
    while True:
        print("-----1-----")
        time.sleep(0.1)
        yield

def task_2():
    while True:
        print("-----2-----")
        time.sleep(0.1)
        yield

def main():
    t1 = task_1()
    t2 = task_2()
    while True:
        next(t1)
        next(t2)

if __name__ == '__main__':
    main()
使用greenlet完成多任务
from greenlet import greenlet
import time

def test1():
    while True:
        print("---A--")
        gr2.switch()
        time.sleep(0.5)

def test2():
    while True:
        print("---B--")
        gr1.switch()
        time.sleep(0.5)

gr1 = greenlet(test1)
gr2 = greenlet(test2)

#切换到gr1中运行
gr1.switch()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!