日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python学习之并发基础知识

發(fā)布時間:2025/3/20 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python学习之并发基础知识 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

8 并發(fā)編程

8.1 基礎(chǔ)知識

8.1.1 操作系統(tǒng)的定義

操作系統(tǒng)是存在于硬件與軟件之間,管理、協(xié)調(diào)、調(diào)度軟件與硬件的交互。

資源管理解決物理資源數(shù)量不足和合理分配資源這兩個問題,

通俗來說,操作系統(tǒng)可以分成兩部分功能:

? 一是將硬件資源接口的調(diào)用變得方便簡單;
? 二是合理調(diào)度應(yīng)用程序?qū)τ布Y源的競態(tài)請求

8.1.2 進(jìn)程

具有獨立功能的程序在某個數(shù)據(jù)集合上的一次運行活動,也是操作系統(tǒng)進(jìn)行資源分配和保護(hù)的基本單位。

正在執(zhí)行的文件或程序,而負(fù)責(zé)執(zhí)行的主體使CPU。

8.1.3 進(jìn)程與程序

? 程序可以說是一些文件或者代碼等指令的集合,程序不能單獨執(zhí)行,只有把程序加載到內(nèi)存中,系統(tǒng)為它分配資源之后才能執(zhí)行,而程序的執(zhí)行就叫線程,進(jìn)程包括程序、數(shù)據(jù)集和進(jìn)程控制三個模塊,是操作系統(tǒng)進(jìn)行資源分配和保護(hù)的基本單位。

? 把一個程序在一個數(shù)據(jù)集上的依次執(zhí)行稱為一個進(jìn)程。程序是靜態(tài)的指令集合,而進(jìn)程是動態(tài)的。

? 同一個程序同時執(zhí)行兩次也是兩個進(jìn)程。

8.1.4 并行與并發(fā)

并發(fā):

? 一個處理器同時處理多個任務(wù);由CPU的多道技術(shù)實現(xiàn),是邏輯上的同時發(fā)生,微觀上仍是同一時刻只能執(zhí)行一個任務(wù),只不過CPU利用多道技術(shù)在多個任務(wù)鍵來回切換執(zhí)行,而切換執(zhí)行的時間差,我們無法察覺,宏觀上感覺是多個任務(wù)同時發(fā)生。

并行:

? 指在同一時刻,有多條指令在多個處理器上同時執(zhí)行,物理上真正實現(xiàn)多任務(wù)同時執(zhí)行。

多道技術(shù):對單個CPU而言,空間上復(fù)用,內(nèi)存中同時存入多道程序;時間復(fù)用,cpu在多個進(jìn)程間快速切換(一是遇到io,二是執(zhí)行一定的時間),使每個進(jìn)程各自運行一定的時間。

【重要概念】

? 串行:所有的進(jìn)程由CPU一個一個的執(zhí)行
? 并發(fā):單個cpu同時執(zhí)行多個進(jìn)程(來回切換),看起來像是同時運行
? 并行:多個cpu真正的同時運行多個程序
? 阻塞:遇到IO(write input read sleep recv accept)才叫阻塞
? 非阻塞:沒有IO

8.1.5 同步/異步&阻塞/非阻塞(重要)

線程

進(jìn)程是負(fù)責(zé)程序執(zhí)行的執(zhí)行單元,一個進(jìn)程中至少有一個線程。

線程與進(jìn)程的區(qū)別:

  • 進(jìn)程是資源分配和調(diào)度的獨立單元,線程是CPU調(diào)度的基本單位
  • 同一個進(jìn)程中可能有多個線程,這些線程共享進(jìn)程的資源,每個線程并行執(zhí)行不同的任務(wù)
同步

發(fā)出一個功能調(diào)用時,在沒有得到結(jié)果之前,該調(diào)用就不返回

【常規(guī)用法】

  • multiprocessing.Pool下的apply 發(fā)起同步調(diào)用命令后,一直等到任務(wù)結(jié)束
  • concurrent.futures.ProcessPoolExecutor().submit(func,).result()
  • concurrent.futures.ThreadPoolExecutor().submit(func,).result()
異步

與同步概念相對,當(dāng)異步功能調(diào)用后,調(diào)用者沒有立即得到結(jié)果,而是等到異步功能完成后,通過狀態(tài)、通知或者回調(diào)函數(shù)來通知調(diào)用者

【常規(guī)用法】

  • multiprocessing.Pool().apply_async() 發(fā)起異步調(diào)用,并不會等待任務(wù)結(jié)束,只是得到一個對象,該對象是可變的,最終變成執(zhí)行結(jié)果
  • concurrent.futures.ProcessPoolExecutor(3).submit(func,)
  • concurrent.futures.ThreadPoolExecutor(3).submit(func,)
from concurrent.futures import ProcessPoolExecutor import os,time,randomdef f():print(f"{os.getpid()} is runing")time.sleep(random.randint(1,3))return f"{os.getpid()} is done "if __name__ == '__main__':p = ProcessPoolExecutor(max_workers=4)l = []sta1 = time.time()for i in range(10):obj = p.submit(f) # 異步調(diào)用執(zhí)行submitl.append(obj)print(f'take {time.time()-sta1} times') # 時間非常短time.sleep(4)sta2 = time.time()for j in l:print(j.result()) # 每一個result都是同步調(diào)用print(f'take {time.time() - sta2} times') # 總耗時時間比較長
阻塞

阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會被掛起,如遇到IO操作,調(diào)用函數(shù)只有在得到結(jié)果之后才會將阻塞的線程激活

非阻塞

與阻塞的概念相對,指在不能立即得到結(jié)果之前也會立刻返回,同時該函數(shù)不會阻塞當(dāng)前線程,程序沒有遇到IO或者遇到IO后通過協(xié)程讓CPU去執(zhí)行本線程里的其他任務(wù),盡可能占用CPU

總結(jié)

? 同步和異步關(guān)注的是消息通信機(jī)制,說的是任務(wù)的發(fā)布與結(jié)果的回收;
? 阻塞和非阻塞關(guān)注的是進(jìn)程在等待調(diào)用結(jié)果時的狀態(tài),阻塞是當(dāng)請求不能滿足的時候就將進(jìn)程掛起,而非阻塞則不會阻塞當(dāng)前進(jìn)程

轉(zhuǎn)載于:https://www.cnblogs.com/jjzz1234/p/11233388.html

總結(jié)

以上是生活随笔為你收集整理的Python学习之并发基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。