> 文章列表 > 小黑向携程进攻啦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 greenletdef 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 1yield from func2()yield 2def func2():yield 3yield 4f1 = 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以及以后版本
小黑向携程进攻啦1:跟紧沛奇老师的携程步伐

服务器安全