您现在的位置是:首页 >技术杂谈 >小黑向携程进攻啦1:跟紧沛奇老师的携程步伐网站首页技术杂谈

小黑向携程进攻啦1:跟紧沛奇老师的携程步伐

小黑无敌 2023-05-16 20:00:02
简介小黑向携程进攻啦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以及以后版本
在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。