Usage of Python coroutine async and await

Usage of Python coroutine async and await

1. Use await keyword

"""
Python协程使用

async
携程函数:python3.5之后使用 async def 函数名,定义的函数就叫携程函数。
携程对象:执行携程函数 函数名(),得到的就是携程对象。

await
await + 可等待对象(协程对象,Future,Task对象(IO等待))。
"""
import asyncio
import time


async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)


async def main():
    task1 = asyncio.create_task(
        say_after(1, 'hello'))

    task2 = asyncio.create_task(
        say_after(2, 'world'))

    print(f"started at {
      
      time.strftime('%X')}")

    # 两个任务同时执行,直到到所有任务执行完成。
    await task1
    print("task add")
    await task2

    print(f"finished at {
      
      time.strftime('%X')}")


if __name__ == '__main__':
    # loop = asyncio.get_event_loop()
    # loop.run_until_complete(main())

    # asyncio.run 等于上面的两行代码
    asyncio.run(main())

2. Add task list

import asyncio
import time


async def func1():
    for i in range(5):
        print('协程1')
        time.sleep(1)


async def func2():
    for i in range(5):
        print('协程2')
        time.sleep(1)

# task可为列表,即任务列表
# task = func1()
task = [func1(), func2()]
# # 创建事件循环
loop = asyncio.get_event_loop()
# # 添加任务,直至所有任务执行完成
loop.run_until_complete(asyncio.wait(task))
# # 关闭事件循环
loop.close()
# # 事件循环关闭后,再次调用loop,将不会再次执行。
# asyncio.run(asyncio.wait(task))

3. Application of coroutines

In fact, you can add await in front of the function's task, then the process will hand over the current control and execute other tasks first.

import asyncio
import requests
import time


async def result(url):
    res = await request_url(url)
    print(url, res)


async def request_url(url):
    res = requests.get(url)
    print(url)
    await asyncio.sleep(2)
    print("execute_time:", time.time() - start)
    return res


url_list = ["https://www.csdn.net/",
            "https://blog.csdn.net/qq_43380180/article/details/111573642",
            "https://www.baidu.com/",
            ]

start = time.time()
print(f"start_time:{
      
      start}\n")

task = [result(url) for url in url_list]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(task))

endtime = time.time() - start
print("\nendtime:", time.time())
print("all_execute_time:", endtime)

Results of the

start_time:1691118061.5575836

https://www.baidu.com/
https://www.csdn.net/
https://blog.csdn.net/qq_43380180/article/details/111573642
execute_time: 4.610013723373413
https://www.baidu.com/ <Response [200]>
execute_time: 4.610013723373413
https://www.csdn.net/ <Response [521]>
execute_time: 6.621567726135254
https://blog.csdn.net/qq_43380180/article/details/111573642 <Response [200]>

endtime: 1691118068.1791513
all_execute_time: 6.621567726135254

Guess you like

Origin blog.csdn.net/HELLOWORLD2424/article/details/132099323