Python asyncio 並發編程 Python Concurrency with Asyncio

[英]馬修·福勒(Matthew Fowler)著 譯 殷海英

  • Python asyncio 並發編程-preview-1
  • Python asyncio 並發編程-preview-2
  • Python asyncio 並發編程-preview-3
Python asyncio 並發編程-preview-1

買這商品的人也買了...

商品描述

標準Python程序很容易過載,從而出現慢如龜爬的情況。asyncio庫正是為瞭解決這些問題而構建的,它簡化了任務的劃分和調度。asyncio可無縫地同時處理多個操作,使應用程序疾如閃電,且具有擴展性。   《Python asyncio並發編程》在大量示例的引導下,介紹異步、並行和並發編程。將難理解的並發內容分解為簡明易懂的流程圖,使讀者可輕松瞭解任務的運行方式。在本書中,讀者將學習如何使用asyncio來突破Python的限制,從而加快Web服務器和微服務的運行速度。讀者甚至可將asyncio與傳統的多處理技術結合起來,以大幅提升性能。 主要內容 ● 通過aiohttp構建支持並發Web請求的Web API ● 同時運行海量SQL查詢 ● 創建一個可並行處理數GB數據的map-reduce作業 ● 在asyncio中使用線程來混合阻塞代碼和asyncio代碼

目錄大綱

 

目    錄

 

 

 

第1 章  asyncio簡介 1

1.1  什麽是asyncio 2

1.2  什麽是I/O密集型和CPU密集型 3

1.3  瞭解並發、並行和多任務處理 4

1.3.1  並發 4

1.3.2  並行 5

1.3.3  並行與並發的區別 6

1.3.4  什麽是多任務 6

1.3.5  協同多任務處理的優勢 7

1.4  瞭解進程、線程、多線程和多處理 7

1.4.1  進程 7

1.4.2  線程 8

1.5  理解全局解釋器鎖 11

1.5.1  GIL會釋放嗎 15

1.5.2  asyncio和GIL 17

1.6  單線程並發 17

1.7  事件循環的工作原理 20

1.8  本章小結 22

第2 章  asyncio基礎 23

2.1  關於協程 23

2.1.1  使用async關鍵字創建協程 24

2.1.2  使用await關鍵字暫停執行 26

2.2  使用sleep引入長時間運行的協程 27

2.3  通過任務實現並行 30

2.3.1  創建任務 30

2.3.2  同時運行多個任務 31

2.4  取消任務和設置超時 34

2.4.1  取消任務 34

2.4.2  設置超時並使用wait_for

執行取消 36

2.5  任務、協程、future和awaitable 38

2.5.1  關於future 38

2.5.2  future、任務和協程之間的關系 40

2.6  使用裝飾器測量協程執行時間 41

2.7  協程和任務的陷阱 43

2.7.1  運行CPU密集型代碼 44

2.7.2  運行阻塞API 46

2.8  手動創建和訪問事件循環 47

2.8.1  手動創建事件循環 47

2.8.2  訪問事件循環 48

2.9  使用調試模式 49

2.9.1  使用asyncio.run 49

2.9.2  使用命令行參數 49

2.9.3  使用環境變量 50

2.10  本章小結 51

第3 章  第一個asyncio應用程序 53

3.1  使用阻塞套接字 54

3.2  使用telnet連接到服務器 56

3.2.1  從套接字讀取和寫入數據 57

3.2.2  允許多個連接和阻塞的危險性 59

3.3  使用非阻塞套接字 61

3.4  使用選擇器模塊構建套接字事件循環 65

3.5  使用asyncio事件循環的

回顯服務器 68

3.5.1  套接字的事件循環協程 69

3.5.2  設計一個異步回顯服務器 69

3.5.3  解決任務中的錯誤 72

3.6  正常關閉 74

3.6.1  監聽信號 74

3.6.2  等待掛起的任務完成 76

3.7  本章小結 79

第4 章  並發網絡請求 81

4.1  aiohttp 82

4.2  異步上下文管理器 82

4.2.1  使用aiohttp發出Web請求 85

4.2.2  使用aiohttp設置超時 87

4.3  並發運行任務及重新訪問 88

4.4  通過gather執行並發請求 91

4.5  在請求完成時立即處理 95

4.6  使用wait進行細粒度控制 99

4.6.1  等待所有任務完成 99

4.6.2  觀察異常 102

4.6.3  當任務完成時處理結果 104

4.6.4  處理超時 107

4.6.5  為什麽要將所有內容都包裝在一個任務中 109

4.7  本章小結 110

第5 章  非阻塞數據庫驅動程序 111

5.1  關於asyncpg 111

5.2  連接Postgres數據庫 112

5.3  定義數據庫模式 113

5.4  使用asyncpg執行查詢 116

5.5  通過連接池實現並發查詢 119

5.5.1  將隨機sku插入products數據庫 119

5.5.2  創建連接池從而同時運行查詢 123

5.6  使用asyncpg管理事務 128

5.6.1  嵌套事務 130

5.6.2  手動管理事務 132

5.7  異步生成器和流式結果集 133

5.7.1  異步生成器介紹 134

5.7.2  使用帶有流游標的異步生成器 135

5.8  本章小結 139

第6 章  處理CPU密集型工作 141

6.1  介紹multiprocessing庫 142

6.2  使用進程池 144

6.3  進程池執行器與asyncio 146

6.3.1  進程池執行器 146

6.3.2  帶有異步事件循環的進程池執行器 148

6.4  使用asyncio解決MapReduce的問題 149

6.4.1  簡單的MapReduce示例 151

6.4.2  Google Books Ngram數據集 153

6.4.3  使用asyncio進行映射和歸約 154

6.5  共享數據和鎖 159

6.5.1  共享數據和競爭條件 160

6.5.2  使用鎖進行同步 163

6.5.3  與進程池共享數據 166

6.6  多進程,多事件循環 170

6.7  本章小結 173

第7 章  通過線程處理阻塞任務 175

7.1  threading模塊 176

7.2  通過asyncio使用線程 180

7.2.1  request庫 180

7.2.2  線程池執行器 181

7.2.3  使用asyncio的線程池執行器 183

7.2.4  默認執行器 184

7.3  鎖、共享數據和死鎖 186

7.3.1  可重入鎖 188

7.3.2  死鎖 190

7.4  單線程中的事件循環 192

7.4.1  Tkinter 193

7.4.2  使用asyncio和線程構建響應式UI 195

7.5  使用線程執行CPU密集型工作 203

7.5.1  多線程與hashlib 203

7.5.2  多線程與NumPy 206

7.6  本章小結 208

第8 章  流 211

8.1  流 212

8.2  傳輸和協議 212

8.3  流讀取與流寫入 216

8.4  非阻塞命令行輸入 219

8.5  創建服務器 230

8.6  創建聊天服務器和客戶端 232

8.7  本章小結 239

第9 章  Web應用程序 241

9.1  使用aiohttp創建REST API 242

9.1.1  什麽是REST 242

9.1.2  aiohttp服務器基礎知識 243

9.1.3  連接到數據庫並返回結果 244

9.1.4  比較aiohttp和Flask 251

9.2  異步服務器網關接口 253

9.3  ASGI 與 Starlette 255

9.3.1  使用Starlette的REST端點 255

9.3.2  WebSocket與Starlette 257

9.4  Django異步視圖 261

9.4.1  在異步視圖中運行阻塞工作 267

9.4.2  在同步視圖中使用異步代碼 268

9.5  本章小結 269

第10 章  微服務 271

10.1  什麽是微服務 272

10.1.1  代碼的復雜性 272

10.1.2  可擴展性 272

10.1.3  團隊和堆棧獨立性 273

10.1.4  asyncio如何提供幫助 273

10.2  backend-for-frontend模式 273

10.3  實施產品列表API 275

10.3.1  “用戶收藏”服務 275

10.3.2  實現基礎服務 276

10.3.3  實現backend-for-frontend服務 281

10.3.4  重試失敗的請求 287

10.3.5  斷路器模式 290

10.4  本章小結 296

第11 章  同步 297

11.1  瞭解單線程並發錯誤 298

11.2  鎖 302

11.3  使用信號量限制並發性 306

11.4  使用事件來通知任務 312

11.5  條件 317

11.6  本章小結 322

第12 章  異步隊列 323

12.1  異步隊列基本知識 324

12.1.1  Web應用程序中的隊列 331

12.1.2  網絡爬蟲隊列 334

12.2  優先級隊列 337

12.3  LIFO隊列 345

12.4  本章小結 347

第13章  管理子進程 349

13.1  創建子進程 349

13.1.1  控制標準輸出 352

13.1.2  同時運行子進程 355

13.2  與子進程進行通信 359

13.3  本章小結 363

第14章  高級asyncio 365

14.1  帶有協程和函數的API 366

14.2  上下文變量 368

14.3  強制事件循環迭代 370

14.4  使用不同的事件循環實現 371

14.5  創建自定義事件循環 373

14.5.1  協程和生成器 373

14.5.2  不建議使用基於生成器的協程 374

14.5.3  自定義可等待對象 376

14.5.4  使用帶有future的套接字 379

14.5.5  任務的實現 381

14.5.6  實現事件循環 383

14.5.7  使用自定義事件循環實現服務器 386

14.6  本章小結 388