【python】基础知识巩固(十一)协程补充

关于携程在上一篇文章,我觉得讲的不太清楚,自己也不太满意,所以写了这篇补充,我自己也参考很多文档,最终写完这篇补充

目录

概念:

补充:

例子 :

1.greenlet实现

2.yield实现

3.asyncio装饰器实现(py 3.4)

async 和 await关键字(py 3.5)


概念:

前面的文章说

 简单来说就是 类似goto的函数,协程可以在一个函数内部跳到另外的函数的东西

来回切换

补充:

1)在操作系统中,并不存在协程,只有线程和进程,协程只是我们程序员自己定义的东西

例子 :

我们有三种在python的写法

1.greenlet实现

早期模块

""" 
CSDN : heart_6662
PYTHON amateur   
"""
from greenlet import greenlet
def func1():
    print(1)   #第二步 输出1
    gr2.switch()  # 第三步切换到func2函数
    print(2)    #第六步, 输出2
    gr2.switch()    #第七步,切换到func2函数,从上次执行的位置继续往后执行

def func2():
    print(3)   #第四步,输出3
    gr1.switch() #第五步,切换到func1函数,从上次执行的位置继续往后执行  
    print(4) #第八步,输出4

gr1 = greenlet(func1())
gr2 = greenlet(func2())
gr1.switch()   #第一步,执行func1函数

输出:1 3 2 4 

2.yield实现

yield from 去到哪里的意思

"""
CSDN : heart_6662
PYTHON amateur
"""

def func1():
    yield 1
    yield from func2()
    yield 2

def func2():
   yield 3
   yield 4

f1 = func1()
for  item in f1:
    print(item)

输出 1 3 2 4 

3.asyncio装饰器实现(py 3.4)

现在基本上不用了,过时了,注意3.8python已经替代了coroutine关键字了

"""
CSDN : heart_6662
PYTHON amateur
"""
import asyncio

@asyncio.coroutine
def func1():
    print(1)
    yield from asyncio.sleep(2)# 遇到io耗时(阻塞),自动化切换到tasks中的任务
    print(2)
    
@asyncio.coroutine
def func2():
    print(3)
    yield from asyncio.sleep(2)  # 遇到io耗时(阻塞),自动化切换到tasks中的任务
    print(4)

tasks = [asyncio.ensure_future(func1()),
         asyncio.ensure_future(func2())]

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

async 和 await关键字(py 3.5)

推荐

"""
CSDN : heart_6662
PYTHON amateur
"""
import asyncio


async def func1():
    print(1)
    await asyncio.sleep(2)# 遇到io耗时(阻塞),自动化切换到tasks中的任务
    print(2)
    

async def func2():
    print(3)
    await asyncio.sleep(2)  # 遇到io耗时(阻塞),自动化切换到tasks中的任务
    print(4)

tasks = [asyncio.ensure_future(func1()),
         asyncio.ensure_future(func2())]

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

输出 1 3 2 4

与上面的操作一样 

猜你喜欢

转载自blog.csdn.net/qq_62932195/article/details/122393302
今日推荐