Python学习之并发基础知识
8 并發編程
8.1 基礎知識
8.1.1 操作系統的定義
操作系統是存在于硬件與軟件之間,管理、協調、調度軟件與硬件的交互。
資源管理解決物理資源數量不足和合理分配資源這兩個問題,
通俗來說,操作系統可以分成兩部分功能:
? 一是將硬件資源接口的調用變得方便簡單;
? 二是合理調度應用程序對硬件資源的競態請求
8.1.2 進程
具有獨立功能的程序在某個數據集合上的一次運行活動,也是操作系統進行資源分配和保護的基本單位。
正在執行的文件或程序,而負責執行的主體使CPU。
8.1.3 進程與程序
? 程序可以說是一些文件或者代碼等指令的集合,程序不能單獨執行,只有把程序加載到內存中,系統為它分配資源之后才能執行,而程序的執行就叫線程,進程包括程序、數據集和進程控制三個模塊,是操作系統進行資源分配和保護的基本單位。
? 把一個程序在一個數據集上的依次執行稱為一個進程。程序是靜態的指令集合,而進程是動態的。
? 同一個程序同時執行兩次也是兩個進程。
8.1.4 并行與并發
并發:
? 一個處理器同時處理多個任務;由CPU的多道技術實現,是邏輯上的同時發生,微觀上仍是同一時刻只能執行一個任務,只不過CPU利用多道技術在多個任務鍵來回切換執行,而切換執行的時間差,我們無法察覺,宏觀上感覺是多個任務同時發生。
并行:
? 指在同一時刻,有多條指令在多個處理器上同時執行,物理上真正實現多任務同時執行。
多道技術:對單個CPU而言,空間上復用,內存中同時存入多道程序;時間復用,cpu在多個進程間快速切換(一是遇到io,二是執行一定的時間),使每個進程各自運行一定的時間。
【重要概念】
? 串行:所有的進程由CPU一個一個的執行
? 并發:單個cpu同時執行多個進程(來回切換),看起來像是同時運行
? 并行:多個cpu真正的同時運行多個程序
? 阻塞:遇到IO(write input read sleep recv accept)才叫阻塞
? 非阻塞:沒有IO
8.1.5 同步/異步&阻塞/非阻塞(重要)
線程
進程是負責程序執行的執行單元,一個進程中至少有一個線程。
線程與進程的區別:
- 進程是資源分配和調度的獨立單元,線程是CPU調度的基本單位
- 同一個進程中可能有多個線程,這些線程共享進程的資源,每個線程并行執行不同的任務
同步
發出一個功能調用時,在沒有得到結果之前,該調用就不返回
【常規用法】
- multiprocessing.Pool下的apply 發起同步調用命令后,一直等到任務結束
- concurrent.futures.ProcessPoolExecutor().submit(func,).result()
- concurrent.futures.ThreadPoolExecutor().submit(func,).result()
異步
與同步概念相對,當異步功能調用后,調用者沒有立即得到結果,而是等到異步功能完成后,通過狀態、通知或者回調函數來通知調用者
【常規用法】
- multiprocessing.Pool().apply_async() 發起異步調用,并不會等待任務結束,只是得到一個對象,該對象是可變的,最終變成執行結果
- concurrent.futures.ProcessPoolExecutor(3).submit(func,)
- concurrent.futures.ThreadPoolExecutor(3).submit(func,)
阻塞
阻塞調用是指調用結果返回之前,當前線程會被掛起,如遇到IO操作,調用函數只有在得到結果之后才會將阻塞的線程激活
非阻塞
與阻塞的概念相對,指在不能立即得到結果之前也會立刻返回,同時該函數不會阻塞當前線程,程序沒有遇到IO或者遇到IO后通過協程讓CPU去執行本線程里的其他任務,盡可能占用CPU
總結
? 同步和異步關注的是消息通信機制,說的是任務的發布與結果的回收;
? 阻塞和非阻塞關注的是進程在等待調用結果時的狀態,阻塞是當請求不能滿足的時候就將進程掛起,而非阻塞則不會阻塞當前進程
轉載于:https://www.cnblogs.com/jjzz1234/p/11233388.html
總結
以上是生活随笔為你收集整理的Python学习之并发基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10
- 下一篇: python列表的增删改查