SlideShare a Scribd company logo
Submit Search
Upload
並行與平行
Report
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
•
7 likes
•
2,655 views
1
of
45
並行與平行
•
7 likes
•
2,655 views
Download Now
Download to read offline
Report
Software
《Python 3.5 技術手冊》第 13 章投影片
Read more
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
Recommended
流程語法與函式
Justin Lin
2.6K views
•
56 slides
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
3.7K views
•
133 slides
例外處理
Justin Lin
1.4K views
•
62 slides
資料永續與交換
Justin Lin
1.8K views
•
71 slides
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Justin Lin
5.6K views
•
66 slides
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
3.4K views
•
74 slides
More Related Content
What's hot
CH11:執行緒與並行API
Justin Lin
320 views
•
89 slides
例外處理
Justin Lin
299 views
•
64 slides
輸入輸出
Justin Lin
578 views
•
48 slides
9. meta-programming
Justin Lin
363 views
•
58 slides
Java SE 8 技術手冊第 8 章 - 例外處理
Justin Lin
3.2K views
•
70 slides
7. 例外處理
Justin Lin
115 views
•
64 slides
What's hot
(20)
CH11:執行緒與並行API
Justin Lin
•
320 views
例外處理
Justin Lin
•
299 views
輸入輸出
Justin Lin
•
578 views
9. meta-programming
Justin Lin
•
363 views
Java SE 8 技術手冊第 8 章 - 例外處理
Justin Lin
•
3.2K views
7. 例外處理
Justin Lin
•
115 views
13.並行、平行與非同步
Justin Lin
•
236 views
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin
•
2.2K views
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Justin Lin
•
2.8K views
4. 流程語法與函式
Justin Lin
•
188 views
如何用JDK8實作一個小型的關聯式資料庫系統
なおき きしだ
•
18.7K views
Java SE 7 技術手冊投影片第 08 章 - 例外處理
Justin Lin
•
2.4K views
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
•
5.3K views
從模組到類別
Justin Lin
•
1.7K views
7. 錯誤處理
Justin Lin
•
307 views
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
•
1.9K views
流程語法與函式
Justin Lin
•
509 views
Java Tutorial:Learn Java in 06:00:00
Justin Lin
•
27.5K views
從模組到類別
Justin Lin
•
500 views
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Justin Lin
•
2.2K views
Viewers also liked
類別的繼承
Justin Lin
1.4K views
•
66 slides
Python Programming Essentials - M44 - Overview of Web Development
P3 InfoTech Solutions Pvt. Ltd.
1.8K views
•
6 slides
Python Programming Essentials - M22 - File Operations
P3 InfoTech Solutions Pvt. Ltd.
1.5K views
•
26 slides
《Python 3.5 技術手冊》第二章草稿
Justin Lin
4.5K views
•
28 slides
除錯、測試與效能
Justin Lin
1.7K views
•
50 slides
Python 3 Programming Language
Tahani Al-Manie
11.5K views
•
57 slides
Viewers also liked
(18)
類別的繼承
Justin Lin
•
1.4K views
Python Programming Essentials - M44 - Overview of Web Development
P3 InfoTech Solutions Pvt. Ltd.
•
1.8K views
Python Programming Essentials - M22 - File Operations
P3 InfoTech Solutions Pvt. Ltd.
•
1.5K views
《Python 3.5 技術手冊》第二章草稿
Justin Lin
•
4.5K views
除錯、測試與效能
Justin Lin
•
1.7K views
Python 3 Programming Language
Tahani Al-Manie
•
11.5K views
Python
Shivam Gupta
•
36.8K views
資料結構
Justin Lin
•
1.8K views
從 REPL 到 IDE
Justin Lin
•
2.3K views
open() 與 io 模組
Justin Lin
•
1.8K views
PyCon Taiwan 2013 Tutorial
Justin Lin
•
290.9K views
3D 之邏輯與美感交會 - OpenSCAD
Justin Lin
•
1.4K views
網站系統安全及資料保護設計認知
Justin Lin
•
3.8K views
常用內建模組
Justin Lin
•
1.4K views
進階主題
Justin Lin
•
3K views
型態與運算子
Justin Lin
•
1.8K views
Python 起步走
Justin Lin
•
7.2K views
初學R語言的60分鐘
Chen-Pan Liao
•
139.8K views
Similar to 並行與平行
並行、平行與非同步
Justin Lin
1.2K views
•
78 slides
6. 非同步設計
Justin Lin
274 views
•
47 slides
Notes of jcip
Dai Jun
2K views
•
134 slides
线程与并发
Tony Deng
1.7K views
•
35 slides
为啥别读HotSpot VM的源码(2012-03-03)
Kris Mok
13.6K views
•
57 slides
Multithread
Medivh2011
211 views
•
50 slides
Similar to 並行與平行
(11)
並行、平行與非同步
Justin Lin
•
1.2K views
6. 非同步設計
Justin Lin
•
274 views
Notes of jcip
Dai Jun
•
2K views
线程与并发
Tony Deng
•
1.7K views
为啥别读HotSpot VM的源码(2012-03-03)
Kris Mok
•
13.6K views
Multithread
Medivh2011
•
211 views
SCJP ch15
r82093403
•
387 views
Noder eyes for frontend guys
Hsu Ping Feng
•
844 views
Chapter2
Fang-Ling Lin
•
1.6K views
笔记
pzh244658240
•
230 views
Ian .net async programming
LearningTech
•
330 views
More from Justin Lin
Ch14 簡介 Spring Boot
Justin Lin
872 views
•
22 slides
Ch13 整合 Spring MVC/Security
Justin Lin
280 views
•
58 slides
Ch12 Spring 起步走
Justin Lin
272 views
•
31 slides
Ch11 簡介 JavaMail
Justin Lin
157 views
•
8 slides
Ch10 Web 容器安全管理
Justin Lin
153 views
•
30 slides
Ch09 整合資料庫
Justin Lin
233 views
•
92 slides
More from Justin Lin
(20)
Ch14 簡介 Spring Boot
Justin Lin
•
872 views
Ch13 整合 Spring MVC/Security
Justin Lin
•
280 views
Ch12 Spring 起步走
Justin Lin
•
272 views
Ch11 簡介 JavaMail
Justin Lin
•
157 views
Ch10 Web 容器安全管理
Justin Lin
•
153 views
Ch09 整合資料庫
Justin Lin
•
233 views
Ch08 自訂標籤
Justin Lin
•
133 views
Ch07 使用 JSTL
Justin Lin
•
161 views
Ch06 使用 JSP
Justin Lin
•
250 views
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
•
204 views
Ch04 會話管理
Justin Lin
•
238 views
Ch03 請求與回應
Justin Lin
•
236 views
Ch02 撰寫與設定 Servlet
Justin Lin
•
352 views
CH1. 簡介 Web 應用程式
Justin Lin
•
1.2K views
14. 進階主題
Justin Lin
•
403 views
12. 除錯、測試與效能
Justin Lin
•
152 views
11. 常用內建模組
Justin Lin
•
146 views
10. 資料永續與交換
Justin Lin
•
156 views
9. 資料結構
Justin Lin
•
292 views
8. open() 與 io 模組
Justin Lin
•
245 views
並行與平行
2.
13. 並行與平行 • 學習目標 –
認識並行與平行處理 – 使用 threading 模組 – 使用 multiprocessing 模組
3.
簡介執行緒
5.
• 雖可以繼承 threading.Thread,
在 __init__()呼叫 super().__init__(), 並在類別中定義run()方法來實作執行緒 • 不過是不建議的,因為這會使得你的流程與 threading.Thread 產生相依性
8.
• python 直譯器同時間只允許執行一個執行 緒,因此並不是真正的平行(Parallel)處 理,只不過「有時候」切換速度快到人類 感覺上像是同時處理罷了 •
執行緒適用的場合之一,就是非計算密集 的場合,因為與其等待某個阻斷作業完成, 不如趁著等待的時間來進行其他執行緒
11.
• 對於計算密集的任務,使用執行緒不見得 會提高處理效率,反而容易因為直譯器必 須切換執行緒而耗費不必要的成本,使得 效率變差。
12.
• 如果主執行緒中啟動了額外執行緒,預設 會等待被啟動的所有執行緒都執行完才中 止程式。 • 如果一個
Thread 建立時,指定了daemon 參數為 True,在所有的非 Daemon 的執 行緒都結束時,程式就會直接終止 • 如果需要在背景執行一些常駐任務,就可 以指定 daemon 參數為 True。
13.
• 當執行緒使用 join()
加入至另一執行緒 時,另一執行緒會等待被加入的執行緒工 作完畢,然後再繼續它的動作
14.
• 如果要停止執行緒,必須自行實作,讓執 行緒跑完應有的流程
15.
競速、鎖定、死結 • 如果執行緒之間不需要共享資料, 或者共 享的資料是不可變動(Immutable)的型 態,事情會單純一些 •
然而,執行緒之間經常得共用一些可變動 狀態的資料… • 要是執行緒之間需要共享的是可變動狀態 的資料,就會有可能發生競速狀況…
17.
• 若要避免競速的情況發生,就必須資源被 變更與取用時的關鍵程式碼進行鎖定
19.
• threading.Lock 實作了情境管理器協定, 可以搭配
with 來簡化 acquire() 與 release() 的呼叫
21.
• 由於執行緒無法取得鎖定時會造成阻斷, 不正確地使用 Lock
有可能造成效能低落, 另一問題則是死結
23.
• threading.RLock 實現了可重入鎖 (Reentrant
lock) • 同一執行緒可以重複呼叫同一個 threading.RLock 實例的 acquire() 而不被阻斷 • release()時也要有對應於 acquire() 的次數,方可以完全解除鎖定 • threading.RLock 也實作了情境管理器 協定,可搭配 with 來使用
24.
• 另一個經常使用的鎖定機制是 threading.Condition • 某個執行緒在透過
acquire() 取得鎖定之 後,若需要在特定條件符合之前等待,可 以呼叫 wait() 方法,這會釋放鎖定 • 若其他執行緒的運作促成特定條件成立, 可以呼叫同一 threading.Condition 實 例的 notify(),通知等待條件的一個執 行緒可取得鎖定
25.
• 若等待中的執行緒取得鎖定,就會從上次 呼叫 wait()
方法處繼續執行 • 如果等待中的執行緒有多個,還可以呼叫 notify_all(),這會通知全部等待中的 執行緒爭取鎖定
28.
• 如果需要這種一進一出,在執行緒之間交 換資料的方式,Python 標準程式庫中提供 了
queue.Queue
29.
• 建立Semaphore 可指定計數器初始值 •
每呼叫一次 acquire(),計數器值遞減一, 在計數器為0 時若呼叫了 acquire(),執 行緒就會被阻斷 • 每呼叫一次 release(),計數器值遞增一, 如果 release()前計數器為 0,而且有執 行緒正在等待,在 release() 並遞增計數 器之後,會通知等待中的執行緒
30.
• 可以設定一個 Barrier
並指定數量 • 如果有執行緒先來到這個柵欄,它必須等 待其他執行緒也來到這個柵欄 • 指定的執行緒數量達到,全部執行緒才能 繼續往下執行
32.
• 針對計算密集式的運算,若能在一個新的 行程(Process)平行(Parallel)運行,在 今日電腦普遍都有多個核心的情況下,就 有機會跑得更快一些。
33.
• subprocess 模組可以讓你在執行
Python 程式的過程中,產生新的子行程
34.
• 從 Python
3.5 開始,建議使用 run() 函 式來呼叫子行程 • subprocess.run() 執行之後會傳回 CompletedProcess 實例 • 若想要能取得標準輸出的執行結果:
35.
• 如果子行程必須接受標準輸入:
36.
• subprocess.run() 的底層是透過 subprocess.Popen()
實作出來的
37.
• subprocess.Popen() 執行程式,會立 即傳回
Popen 實例,不會等待子行程結束
39.
• 如果想要以子行程來執行函式,然而使用 類似 threading
模組的 API 介面,那麼 可以使用 multiprocessing 模組
41.
• 建議在使用 multiprocessing
模組時, 最好的方式是不要共享狀態 • 然而有時行程之間難免需要進行溝通, multiprocessing.Queue 是執行緒與行 程安全的,實作了必要的鎖定機制
44.
• multiprocessing.Lock 也實作了情境 管理器協定