您现在的位置是:首页 >技术杂谈 >小黑向携程进攻啦1:跟紧沛奇老师的携程步伐网站首页技术杂谈
小黑向携程进攻啦1:跟紧沛奇老师的携程步伐
简介小黑向携程进攻啦1:跟紧沛奇老师的携程步伐
为什么要学
- 异步非阻塞、asyncio
- tornado、fastapi、django 3.x asgi、aiohttp都在异步->提升功能
如何讲解?
- 协程
- asyncio模块进行异步编程
- 实战案例
1.协程
协程不是计算机提供,程序员人为创造出来的。协程,又称微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。例如
def func1():
print(1)
...
print(2)
def func2():
print(3)
...
print(4)
func1()
func2()
实现协程有这么几种方法:
- greenlet,早起模块。
- yield关键字
- asyncio装饰器(py3.4)
- async、await关键字(py3.5) 【推荐】
1.1greenlet实现协程
pip3 install greenlet
from greenlet import greenlet
def func1():
print(1)
gr2.switch()
print(3)
gr2.switch()
def func2():
print(2)
gr1.switch()
print(4)
gr1 = greenlet(func1)
gr2 = greenlet(func2)
gr1.switch() # 第1步:去执行func1函数
1.2 yield关键字
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 asyncio
在python3,4之后的版本。
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)
loop = asyncio.get_event_loop()
loop.run_until_complete(func1())
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)
loop = asyncio.get_event_loop()
tasks = [
asyncio.ensure_future(func1()),
asyncio.ensure_future(func2())
]
loop.run_until_complete(asyncio.wait(tasks))
注意:遇到IO阻塞自动切换
1.4 async & await关键字
在python3.5以及以后版本
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。