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 )>)