天天看點

Python基礎-異步IO的支援 async和await

Python 3.5開始引入了新的文法async和await,可以讓coroutine的代碼更簡潔易讀。

需求

使用async和await實作異步通路多個網站首頁的異步任務

運作示例

# main.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Python基礎-異步IO的支援 async和await

# asyncio的程式設計模型就是一個消息循環
import threading
import asyncio

# 把 generator 标記為 coroutine 類型,便于執行 EventLoop
async def func(name):
    print('Start %s! (%s)' % (name, threading.currentThread()))
    # yield from文法可以讓我們友善地調用另一個generator
    if name == "通路百度":
        print("%s 延遲 1秒" % name)
        await asyncio.sleep()
    elif name == "通路Google":
        print("%s 延遲 5秒" % name)
        await asyncio.sleep()
    else:
        print("%s 延遲 3秒" % name)
        await asyncio.sleep()

    print('\n End %s!! (%s)' % (name, threading.currentThread()))


# 擷取 EventLoop
loop = asyncio.get_event_loop()

tasks = [func("通路百度"),func("通路Google"),func("通路Python")]

# 執行 coroutine
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
           

運作結果

D:\PythonProject\sustudy>python main.py
Start 通路Google! (<_MainThread(MainThread, started )>)
通路Google 延遲 秒
Start 通路Python! (<_MainThread(MainThread, started )>)
通路Python 延遲 秒
Start 通路百度! (<_MainThread(MainThread, started )>)
通路百度 延遲 秒

 End 通路百度!! (<_MainThread(MainThread, started )>)

 End 通路Python!! (<_MainThread(MainThread, started )>)

 End 通路Google!! (<_MainThread(MainThread, started )>)
           

繼續閱讀