关于携程在上一篇文章,我觉得讲的不太清楚,自己也不太满意,所以写了这篇补充,我自己也参考很多文档,最终写完这篇补充
目录
概念:
前面的文章说
简单来说就是 类似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
与上面的操作一样