SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
並行、平行與非同步
Report
Justin Lin
Follow
Technology / Community Evangelist at Free lancer
Dec. 27, 2018
•
0 likes
•
1,227 views
1
of
78
並行、平行與非同步
Dec. 27, 2018
•
0 likes
•
1,227 views
Download Now
Download to read offline
Report
Technology
認識並行、平行與非同步 使用 threading 模組 使用 multiprocessing 模組 使用 concurrent.futures模組 運用 async、await 與 asyncio
Justin Lin
Follow
Technology / Community Evangelist at Free lancer
Recommended
6. 非同步設計
Justin Lin
274 views
•
47 slides
除錯、測試與效能
Justin Lin
508 views
•
50 slides
9. meta-programming
Justin Lin
363 views
•
58 slides
13.並行、平行與非同步
Justin Lin
234 views
•
81 slides
Share module
dpf2e
369 views
•
19 slides
Ch06 使用JSP
Justin Lin
532 views
•
86 slides
More Related Content
What's hot
KSDG-ASP.NET MVC 5 Overview (偽三國誌)
Bruce Chen
850 views
•
24 slides
Ch02 撰寫與設定Servlet
Justin Lin
998 views
•
37 slides
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Justin Lin
2K views
•
19 slides
Asp.net mvc 概觀介紹
Alan Tsai
5.4K views
•
60 slides
Ch13 整合 Spring MVC/Security
Justin Lin
279 views
•
58 slides
TypeScript-twmvc#16
twMVC
1.3K views
•
30 slides
What's hot
(20)
KSDG-ASP.NET MVC 5 Overview (偽三國誌)
Bruce Chen
•
850 views
Ch02 撰寫與設定Servlet
Justin Lin
•
998 views
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Justin Lin
•
2K views
Asp.net mvc 概觀介紹
Alan Tsai
•
5.4K views
Ch13 整合 Spring MVC/Security
Justin Lin
•
279 views
TypeScript-twmvc#16
twMVC
•
1.3K views
以Code igniter為基礎的網頁前端程式設計
Amigo 陳兆祥
•
4.9K views
自訂泛型、列舉與標註
Justin Lin
•
633 views
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
•
3.6K views
1. JavaScript 起步走
Justin Lin
•
763 views
Ch07 使用JSTL
Justin Lin
•
430 views
Ch13 整合Spring MVC
Justin Lin
•
786 views
Angular.js & ASP.NET in Study4
Kyle Shen
•
1.4K views
7. 錯誤處理
Justin Lin
•
306 views
Java Tutorial:Learn Java in 06:00:00
Justin Lin
•
27.5K views
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Justin Lin
•
2.1K views
Android开发基础
ykdsg
•
3K views
工作坊總結
Shengyou Fan
•
4.3K views
Entity Framework實戰
國昭 張
•
1.8K views
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)
Will Huang
•
17.4K views
Similar to 並行、平行與非同步
並行與平行
Justin Lin
2.6K views
•
45 slides
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
3.1K views
•
129 slides
執行緒與並行API
Justin Lin
877 views
•
133 slides
Notes of jcip
Dai Jun
2K views
•
134 slides
CH11:執行緒與並行API
Justin Lin
317 views
•
89 slides
SCJP ch15
r82093403
386 views
•
107 slides
Similar to 並行、平行與非同步
(7)
並行與平行
Justin Lin
•
2.6K views
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
•
3.1K views
執行緒與並行API
Justin Lin
•
877 views
Notes of jcip
Dai Jun
•
2K views
CH11:執行緒與並行API
Justin Lin
•
317 views
SCJP ch15
r82093403
•
386 views
Chapter2
Fang-Ling Lin
•
1.6K views
More from Justin Lin
Ch12 Spring 起步走
Justin Lin
265 views
•
31 slides
Ch11 簡介 JavaMail
Justin Lin
155 views
•
8 slides
Ch10 Web 容器安全管理
Justin Lin
152 views
•
30 slides
Ch09 整合資料庫
Justin Lin
229 views
•
92 slides
Ch08 自訂標籤
Justin Lin
131 views
•
54 slides
Ch07 使用 JSTL
Justin Lin
155 views
•
74 slides
More from Justin Lin
(20)
Ch12 Spring 起步走
Justin Lin
•
265 views
Ch11 簡介 JavaMail
Justin Lin
•
155 views
Ch10 Web 容器安全管理
Justin Lin
•
152 views
Ch09 整合資料庫
Justin Lin
•
229 views
Ch08 自訂標籤
Justin Lin
•
131 views
Ch07 使用 JSTL
Justin Lin
•
155 views
Ch06 使用 JSP
Justin Lin
•
245 views
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
•
200 views
Ch04 會話管理
Justin Lin
•
235 views
Ch03 請求與回應
Justin Lin
•
230 views
Ch02 撰寫與設定 Servlet
Justin Lin
•
337 views
CH1. 簡介 Web 應用程式
Justin Lin
•
1.1K views
14. 進階主題
Justin Lin
•
401 views
12. 除錯、測試與效能
Justin Lin
•
148 views
11. 常用內建模組
Justin Lin
•
140 views
10. 資料永續與交換
Justin Lin
•
148 views
9. 資料結構
Justin Lin
•
285 views
8. open() 與 io 模組
Justin Lin
•
243 views
7. 例外處理
Justin Lin
•
114 views
6. 類別的繼承
Justin Lin
•
165 views
Recently uploaded
黃俊毓講師_以黑客精神黑客自己的家鄉.pdf
俊毓 黃
26 views
•
41 slides
ncuma_數值求根法.pptx
NCU MCL
15 views
•
5 slides
ncuma_微分方程式.pptx
NCU MCL
6 views
•
7 slides
ncuma_SymPy符號運算套件.pptx
NCU MCL
99 views
•
37 slides
ncuma_Taylor 多項式_習題2.pptx
NCU MCL
9 views
•
2 slides
ncuma_極座標畫圖.pptx
NCU MCL
6 views
•
3 slides
Recently uploaded
(20)
黃俊毓講師_以黑客精神黑客自己的家鄉.pdf
俊毓 黃
•
26 views
ncuma_數值求根法.pptx
NCU MCL
•
15 views
ncuma_微分方程式.pptx
NCU MCL
•
6 views
ncuma_SymPy符號運算套件.pptx
NCU MCL
•
99 views
ncuma_Taylor 多項式_習題2.pptx
NCU MCL
•
9 views
ncuma_極座標畫圖.pptx
NCU MCL
•
6 views
ncuma_函數畫圖_習題3.pptx
NCU MCL
•
917 views
ncuma_字串.pptx
NCU MCL
•
33 views
ncuma_牛頓法_習題1.pptx
NCU MCL
•
7 views
Keysight Recent Press Release for 5G RAN 20220725.pdf
TimmyCheng5
•
7 views
ncuma_函數微分計算.pptx
NCU MCL
•
27 views
ncuma_函數畫圖_習題1.pptx
NCU MCL
•
477 views
ncuma_函數微分計算_習題2.pptx
NCU MCL
•
18 views
ncuma_pylab.pptx
NCU MCL
•
276 views
ncuma_Taylor 多項式_習題1.pptx
NCU MCL
•
12 views
ncuma_SymPy符號運算套件_習題2.pptx
NCU MCL
•
6 views
ncuma_型別與迴圈.pptx
NCU MCL
•
2K views
ncuma_串列.pptx
NCU MCL
•
52 views
ncuma_函數畫圖.pptx
NCU MCL
•
680 views
ncuma_函數微分計算_習題1.pptx
NCU MCL
•
31 views
並行、平行與非同步
2.
13.並行、平行與非同步 • 學習目標 – 認識並行、平行與非同步 –
使用 threading 模組 – 使用 multiprocessing 模組 – 使用 concurrent.futures模組 – 運用 async、await 與 asyncio 2
3.
並行 • 多個流程可以並行(Concurrency)處理, 也就是從使用者的觀點來看,會是同時 「執行」各個流程 • 然而實際上,是同時「管理」多個流程 3
4.
簡介執行緒 4
5.
5
6.
• 雖可以繼承 threading.Thread,
在 __init__()呼叫 super().__init__(), 並在類別中定義run()方法來實作執行緒 • 不過是不建議的,因為這會使得你的流程與 threading.Thread 產生相依性 6
7.
7
8.
8
9.
• python 直譯器同時間只允許執行一個執行 緒,因此並不是真正的平行(Parallel)處 理,只不過「有時候」切換速度快到人類 感覺上像是同時處理罷了 •
執行緒適用的場合之一,就是非計算密集 的場合,因為與其等待某個阻斷作業完成, 不如趁著等待的時間來進行其他執行緒 9
10.
10
11.
11
12.
• 對於計算密集的任務,使用執行緒不見得 會提高處理效率,反而容易因為直譯器必 須切換執行緒而耗費不必要的成本,使得 效率變差。 12
13.
• 如果主執行緒中啟動了額外執行緒,預設 會等待被啟動的所有執行緒都執行完才中 止程式。 • 如果一個
Thread 建立時,指定了daemon 參數為 True,在所有的非 Daemon 的執 行緒都結束時,程式就會直接終止 • 如果需要在背景執行一些常駐任務,就可 以指定 daemon 參數為 True。 13
14.
• 當執行緒使用 join()
加入至另一執行緒 時,另一執行緒會等待被加入的執行緒工 作完畢,然後再繼續它的動作 14
15.
• 如果要停止執行緒,必須自行實作,讓執 行緒跑完應有的流程 15
16.
競速、鎖定、死結 • 如果執行緒之間不需要共享資料, 或者共 享的資料是不可變動(Immutable)的型 態,事情會單純一些 •
然而,執行緒之間經常得共用一些可變動 狀態的資料… • 要是執行緒之間需要共享的是可變動狀態 的資料,就會有可能發生競速狀況… 16
17.
17
18.
• 若要避免競速的情況發生,就必須資源被 變更與取用時的關鍵程式碼進行鎖定 18
19.
19
20.
• threading.Lock 實作了情境管理器協定, 可以搭配
with 來簡化 acquire() 與 release() 的呼叫 20
21.
21
22.
• 執行緒無法取得鎖定時會造成阻斷,不正 確地使用 Lock
有可能造成效能低落,另一 問題則是死結 22
23.
23
24.
• threading.RLock 實現了可重入鎖 (Reentrant
lock) • 同一執行緒可以重複呼叫同一個 threading.RLock 實例的 acquire() 而不被阻斷 • release()時也要有對應於 acquire() 的次數,方可以完全解除鎖定 • threading.RLock 也實作了情境管理器 協定,可搭配 with 來使用 24
25.
• 另一個經常使用的鎖定機制是 threading.Condition • 某個執行緒在透過
acquire() 取得鎖定之 後,若需要在特定條件符合之前等待,可 以呼叫 wait() 方法,這會釋放鎖定 • 若其他執行緒的運作促成特定條件成立, 可以呼叫同一 threading.Condition 實 例的 notify(),通知等待條件的一個執 行緒可取得鎖定 25
26.
• 若等待中的執行緒取得鎖定,就會從上次 呼叫 wait()
方法處繼續執行 • 如果等待中的執行緒有多個,還可以呼叫 notify_all(),這會通知全部等待中的 執行緒爭取鎖定 26
27.
27
28.
28
29.
• 如果需要這種一進一出,在執行緒之間交 換資料的方式,Python 標準程式庫中提供 了
queue.Queue 29
30.
• 建立Semaphore 可指定計數器初始值 •
每呼叫一次 acquire(),計數器值遞減一, 在計數器為0 時若呼叫了 acquire(),執 行緒就會被阻斷 • 每呼叫一次 release(),計數器值遞增一, 如果 release()前計數器為 0,而且有執 行緒正在等待,在 release() 並遞增計數 器之後,會通知等待中的執行緒 30
31.
• 可以設定一個 Barrier
並指定數量 • 如果有執行緒先來到這個柵欄,它必須等 待其他執行緒也來到這個柵欄 • 指定的執行緒數量達到,全部執行緒才能 繼續往下執行 31
32.
32
33.
平行 • 針對計算密集式的運算,若能在一個新的 行程(Process)平行(Parallel)運行,在 今日電腦普遍都有多個核心的情況下,就 有機會跑得更快一些。 33
34.
• subprocess 模組可以讓你在執行
Python 程式的過程中,產生新的子行程 34
35.
• 從 Python
3.5 開始,建議使用 run() 函 式來呼叫子行程 • subprocess.run() 執行之後會傳回 CompletedProcess 實例 • 若想要能取得標準輸出的執行結果: 35
36.
• 如果子行程必須接受標準輸入: 36
37.
• subprocess.run() 的底層是透過 subprocess.Popen()
實作出來的 37
38.
• subprocess.Popen() 執行程式,會立 即傳回
Popen 實例,不會等待子行程結束 38
39.
39
40.
• 如果想要以子行程來執行函式,然而使用 類似 threading
模組的 API 介面,那麼 可以使用 multiprocessing 模組 40
41.
41
42.
• 建議在使用 multiprocessing
模組時, 最好的方式是不要共享狀態 • 然而有時行程之間難免需要進行溝通, multiprocessing.Queue 是執行緒與行 程安全的,實作了必要的鎖定機制 42
43.
43
44.
44
45.
• multiprocessing.Lock 也實作了情境 管理器協定 45
46.
46
47.
非同步 • Python 3.2
新增 concurrent.futures 模組,它提供了執行緒或行程高階封裝, 也便於實現非同步的任務 • 從 Python 3.5 之後,提供了async、 await 等語法,以及 asyncio 模組的支援, 如果非同步任務涉及大量的輸入輸出,可 以善用這些特性 47
48.
使用 concurrent.futures • 提供了
ThreadPoolExecutor 與 ProcessPoolExecutor 等高階API,分 別為執行緒與行程提供了工作者池的服務 48
49.
49
50.
• 對於計算密集式的任務,可以使用 ProcessPoolExecutor 50
51.
51
52.
• 使用 map()
方法來簡化程式的撰寫 52
53.
Future 與非同步 • 獨立於程式主流程的任務、事件生成,以 及處理事件的方式,稱為非同步 •
使用執行緒或行程時,若想實現非同步概 念,方式之一是採用註冊回呼函式 53
54.
54
55.
• executor 的submit()
執行過後會傳回 Future,擁有 add_done_callback() 55
56.
• 在下載的同時實現簡單的進度列: 56
57.
略談 yield from
與非同步 57
58.
• 若後續處理為數個非同步函式的話,整個 流程會馬上陷入難以理解的狀態 • Python
3.3 時新增了 yield from 語法, Python 3.4 的 asyncio 與某些第三方程式 庫,曾基於這個語法提出了解決方案 • Python 3.5 後建議不要使用 yield from, 建議使用 async、await 58
59.
59
60.
yield from 與
Future 60
61.
• 有多個非同步函式,顯然就需要個迴圈: 61
62.
• 程式執行雖然是非同步,然而撰寫風格上 卻像是循序 • 若有人想呼叫
asyncTasks() 呢?甚至是 在流程上組合多個這類的函式? 62
63.
63
64.
64
65.
async、asyncio 與並行 • 並非一定要多執行緒或多行程,才能實現 並行 •
多執行緒或多行程只是實現並行比較容易 • 只要執行環境支援,在單一行程、單一執 行緒中,也有可能實現並行 – 在遇到阻斷操作時會讓出(yield)流程控制權 給呼叫函式者,那呼叫函式的一方,就可以繼 續下個並行任務的啟動 65
66.
• 如果在定義函式時,加上了 async
關鍵字, 呼叫該函式並不會馬上執行函式流程,而 是傳回一個 coroutine 物件 • 想要執行函式中定義的流程,可以透過 asyncio.run() 函式 66
67.
• 透過 asyncio.get_event_loop()
建立 事件迴圈代表物件,然後透過它的 run_until_complete() 等方法來執行 67
68.
68
69.
• 透過 asyncio.gather()
函式,直接收 集多個 coroutine 傳回新的 coroutine 69
70.
async、await 與非同步 • async
用來標示函式執行時是非同步,也 就是函式中定義定義了獨立於程式主流程 的任務 • 後續若要在任務完成時,做進一步的處理 也是可行的 • 從 Python 3.5 開始,yield from 已經不 建議使用,因為有了語義更明確的 await 70
71.
71
72.
• 就語義上,若想等待 async
函式執行完後, 再執行後續的流程,可以使用await • async 函式的任務完成後若有傳回值,會 成為 await 的傳回值 72
73.
73
74.
74
75.
非同步產生器與 async for 75 •
迭代產生器時會以阻斷方式讀取 URL 後傳 回 bytes
76.
76
77.
情境管理器與 async with 77
78.
78