
579
18
非同步的替代方案
對於
I/O bound
的程式碼(代表花很多時間進行輸入 / 輸出的程式碼),效
能最佳的架構通常是
非同步
(
asynchronous
,即
async
)的,只要 I/O 作業
可以是
非阻斷
(
nonblocking
)的,這代表你的程式碼可以發起一個作業,
並在那個作業進行的同時,去做其他的事情,然後找出該作業何時完成。
Async 架構有時也稱為
事件驅動
(
event-driven
)架構,因為 I/O 作業的完
成(輸入管道上有新的資料可取用,或輸出管道準備好接受新的資料)可
被模型化(modeled)為你程式碼外部的「事件(events)」,而你的程式碼
會以適當的方式回應它們。
非同步的架構(asynchronous architectures)可分為三大類:
• 在有時被稱為
多工
(
multiplexed
) async 架構的這種架構中,你的程式
碼會追蹤記錄其上可能有作業待處理的 I/O 管道(I/O channels),在一
或多個待處理的 I/O 作業完成前你什麼都沒辦法做的情況中,執行你程
式碼的執行緒會進入阻斷中的等候(blocking wait,這種情形通常被稱
為「你的程式碼
阻斷
(
blocks
)了」),明確地說,是在相關的一組管
道上等候任何的完成。當某個完成喚醒了阻斷中的等候,你的程式碼
就會處理那個完成的具體細節(這種處理可能包括發動更多的 I/O 作
業),然後,通常就會回到阻斷中的等候。Python 提供了數個低階模
組,支援多工的非同步架構,但要用的話,最好還是高階的 ...