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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python学习之并发基础知识

發布時間:2025/3/20 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,)
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) # 異步調用執行submitl.append(obj)print(f'take {time.time()-sta1} times') # 時間非常短time.sleep(4)sta2 = time.time()for j in l:print(j.result()) # 每一個result都是同步調用print(f'take {time.time() - sta2} times') # 總耗時時間比較長
阻塞

阻塞調用是指調用結果返回之前,當前線程會被掛起,如遇到IO操作,調用函數只有在得到結果之后才會將阻塞的線程激活

非阻塞

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

總結

? 同步和異步關注的是消息通信機制,說的是任務的發布與結果的回收;
? 阻塞和非阻塞關注的是進程在等待調用結果時的狀態,阻塞是當請求不能滿足的時候就將進程掛起,而非阻塞則不會阻塞當前進程

轉載于:https://www.cnblogs.com/jjzz1234/p/11233388.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。