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