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

歡迎訪問 生活随笔!

生活随笔

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

python

python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

發布時間:2025/6/15 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python網絡編程基礎(線程與進程、并行與并發、同步與異步、阻塞與非阻塞、CPU密集型與IO密集型)

目錄

線程與進程并行與并發同步與異步阻塞與非阻塞CPU密集型與IO密集型

?

?

?

線程與進程

進程?

?

前言

進程的出現是為了更好的利用CPU資源使到并發成為可能。 假設有兩個任務A和B,當A遇到IO操作,CPU默默的等待任務A讀取完操作再去執行任務B,這樣無疑是對CPU資源的極大的浪費。聰明的老大們就在想若在任務A讀取數據時
,讓任務B執行,當任務A讀取完數據后,再切換到任務A執行。注意關鍵字切換,自然是切換,那么這就涉及到了狀態的保存,狀態的恢復,加上任務A與任務B所需要的系統資源(內存,硬盤,鍵盤等等)是不一樣的。自然而然的就
需要有一個東西去記錄任務A和任務B分別需要什么資源,怎樣去識別任務A和任務B等等。登登登,進程就被發明出來了。通過進程來分配系統資源,標識任務。如何分配CPU去執行進程稱之為調度,進程狀態的記錄,恢復,切換稱之
為上下文切換。進程是系統資源分配的最小單位,進程占用的資源有:地址空間,全局變量,文件描述符,各種硬件等等資源。

  

進程的定義

首先進程不是程序!!! 進程是個抽象的概念 進程:最小的資源單位 進程就是一個程序在一個數據集上的一次動態執行過程 進程一般由程序、數據集、進程控制塊三部分組成 我們編寫的程序用來描述進程要完成哪些功能以及如何完成 數據集則是程序在執行過程中需要使用的資源。 進程控制塊用來記錄進程的外部特征。描述進程的執行變化過程,系統可以利用它來控制和管理進程,它是系統感知進程存在的唯一標志。

 

進程的三種狀態

?

進程的再理解

1)進程上下文:進程的物理實體與支持進程運行的物理環境,包括:地址空間,系統棧,打開文件表,…2)上下文切換:由一個進程的上下文轉到另一個進程的上下文;3)系統開銷:運行操作系統程序完成系統管理工作所花費的時間和空間;4)一個進程可以包含多個線程。

  

?

?

?

?

線程

前言

線程的出現是為了降低上下文切換的消耗,提高系統的并發性,并突破一個進程只能干一樣事的缺陷,使到進程內并發成為可能。假設,一個文本程序,需要接受鍵盤輸入,將內容顯示在屏幕上,還需要保存信息到硬盤中。若只有一
個進程,勢必造成同一時間只能干一樣事的尷尬(當保存時,就不能通過鍵盤輸入內容)。若有多個進程,每個進程負責一個任務,進程A負責接收鍵盤輸入的任務,進程B負責將內容顯示在屏幕上的任務,進程C負責保存內容到硬盤
中的任務。這里進程A,B,C間的協作涉及到了進程通信問題,而且有共同都需要擁有的東西-------文本內容,不停的切換造成性能上的損失。若有一種機制,可以使任務A,B,C共享資源,這樣上下文切換所需要保存和恢復的內
容就少了,同時又可以減少通信所帶來的性能損耗,那就好了。是的,這種機制就是線程。線程共享進程的大部分資源,并參與CPU的調度, 當然線程自己也是擁有自己的資源的,例如,棧,寄存器等等。 此時,進程同時也是線程
的容器。線程也是有著自己的缺陷的,例如健壯性差,若一個線程掛掉了,整一個進程也掛掉了,這意味著其它線程也掛掉了,進程卻沒有這個問題,一個進程掛掉,另外的進程還是活著。

  

線程的定義

線程:最小的執行單位 一個進程中可以開多個線程,為什么要有進程,而不做成線程呢?因為一個程序中,線程共享一套數據,如果都做成進程,每個進程獨占一塊內存,那這套數據就要復制好幾份給每個程序,不合理,所以有了線程。線程又叫輕量級進程,是一個基本的cpu執行單元,也是程序執行過程中的最小單元。一個進程最少也會有一個主線程,在主線程中通過threading模塊,在開子線程進程下的執行單位 而進程相當于線程的容器 也需要注意進程下面還可以繼續創建進程 當然線程最大的特點就是共享這個進程的所有資源

  

程序運行的原理

分時調度 所有線程輪流使用 CPU 的使用權,平均分配每個線程占用 CPU 的時間。搶占式調度 優先讓優先級高的線程使用 CPU,如果線程的優先級相同,那么會隨機選擇一個(線程隨機性),Java使用的為搶占式調度。大部分操作系統都支持多進程并發運行,現在的操作系統幾乎都支持同時運行多個程序。比如:現在我們上課一邊使用編輯器,一邊使用錄屏軟件,同時還開著畫圖板,dos窗口等軟件。此時,這些程序是在同時運行,”感覺這些軟件
好像在同一時刻運行著“。實際上,CPU(中央處理器)使用搶占式調度模式在多個線程間進行著高速的切換。對于CPU的一個核而言,某個時刻,只能執行一個線程,而 CPU的在多個線程間切換速度相對我們的感覺要快,看上去就是在同一時刻運行。其實,多線程程序并不能提高程序的運行速度,但能夠提高程序運行效率,讓CPU的使用率更高。

  

總結

1.一個程序至少有一個進程,一個進程至少有一個線程,(進程可以理解成線程的容器) 2.進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率 3.線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口,順序執行序列和程序的出口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制 4.進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位 線程是進程的一個實體,是cpu調度和分配的基本單位,它是比進程更小的能獨立運行的基本單位,線程自己基本不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧)但是它可與同屬一個進程的
其他的線程共享進程所擁有的全部資源 5.cpu分配給線程,即真正在cpu上運行的是線程
6.一個線程可以創建和撤銷另一個線程:同一個進程中的多個線程之間可以并發

?

?

?

并行與并發

?

并行

并行就是指同一時刻有兩個或兩個以上的“工作單位”在同時執行,從硬件的角度上來看就是同一時刻有兩條或兩條以上的指令處于執行階段。所以,多核是并行的前提,單線程永遠無法達到并行狀態。可以利用多線程和度進程到達并
行狀態。另外的,Python的多線程由于GIL的存在,對于Python來說無法通過多線程到達并行狀態。并行處理是指計算機系統中能同時執行兩個或多個任務的計算方法,并行處理可同時工作于同一程序的不同方面。

  

?

并發

并發 對于并發的理解,要從兩方面去理解 1.并發設計 2.并發執行。 先說并發設計,當說一個程序是并發的,更多的是指這個程序采取了并發設計。 并發設計的標準:使多個操作可以在重疊的時間段內進行 ,這里的重點在于重疊的時間內, 重疊時間可以理解為一段時間內。例如:在時間1s秒內, 具有IO操作的task1和task2都完成,這就可以說是并發執行。所以呢,單線程
也是可以做到并發運行的。當然啦,并行肯定是并發的。 一個程序能否并發執行,取決于設計,也取決于部署方式。例如, 當給程序開一個線程(協程是不開的),它不可能是并發的,因為在重疊時間內根本就沒有兩個task在運行。當一個程序被設計成完成一個任務再去完成下一個任務的
時候,即便部署是多線程多協程的也是無法達到并發運行的。

 

?

?

?

?

?

總結

并發:是指系統具有處理多個任務(動作)的能力 并行:是指系統具有同時處理多個任務(動作)的能力 并行與并發的關系: 并發的設計使到并發執行成為可能,而并行是并發執行的其中一種模式 并發處理是同一時間段內有幾個程序都在一個cpu中處于運行狀態,但任一時刻只有一個程序在cpu上運行。

  

?

?

?

同步與異步

同步和異步關注的是消息通信機制?(synchronous communication/ asynchronous communication)

同步

所謂同步,就是在發出一個*調用*時,在沒有得到結果之前,該*調用*就不返回。但是一旦調用返回,就得到返回值了。 換句話說,就是由*調用者*主動等待這個*調用*的結果。

?

當進程執行到一個IO操作(等待外部數據)的時候,一直等待外部數據,接收到數據后,再繼續運行

  

?

異步

異步則是相反,*調用*在發出之后,這個調用就直接返回了,所以沒有返回結果。換句話說,當一個異步過程調用發出后,調用者不會立刻得到結果。而是在*調用*發出后,*被調用者*通過狀態、通知來通知調用者,或通過回調函數處理這個調用。

?

當進程執行到一個IO操作(等待外部數據)的時候,不主動等待數據,一邊執行別的任務,外部數據發送過來,接收到數據再回來繼續運行。

      同步查詢          異步查詢 

?

?

?

 

?

?

阻塞和非阻塞

阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態. 阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才會返回。 非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。

網絡IO

1.對于網絡IO主要指socket;

2.socket會在conenct/read/write時發生阻塞。

概念

1.阻塞調用是指調用結果返回之前,當前線程會被掛起。函數只有在得到結果之后才會返回

1)connect阻塞

?

2)接收數據阻塞

2.非阻塞指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回

1)接收數據非阻塞

2)非阻塞面臨的問題

?

?

1.同步與異步
同步和異步關注的是消息通信機制 (synchronous communication/ asynchronous communication)
所謂同步,就是在發出一個*調用*時,在沒有得到結果之前,該*調用*就不返回。但是一旦調用返回,就得到返回值了。
換句話說,就是由*調用者*主動等待這個*調用*的結果。

而異步則是相反,*調用*在發出之后,這個調用就直接返回了,所以沒有返回結果。換句話說,當一個異步過程調用發出后,調用者不會立刻得到結果。而是在*調用*發出后,*被調用者*通過狀態、通知來通知調用者,或通過回調函數處理這個調用。

典型的異步編程模型比如Node.js

舉個通俗的例子:
你打電話問書店老板有沒有《分布式系統》這本書,如果是同步通信機制,書店老板會說,你稍等,”我查一下",然后開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(返回結果)。
而異步通信機制,書店老板直接告訴你我查一下啊,查好了打電話給你,然后直接掛電話了(不返回結果)。然后查好了,他會主動打電話給你。在這里老板通過“回電”這種方式來回調。

2. 阻塞與非阻塞
阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.

阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才會返回。
非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。

還是上面的例子,
你打電話問書店老板有沒有《分布式系統》這本書,你如果是阻塞式調用,你會一直把自己“掛起”,直到得到這本書有沒有的結果,如果是非阻塞式調用,你不管老板有沒有告訴你,你自己先一邊去玩了, 當然你也要偶爾過幾分鐘check一下老板有沒有返回結果。
在這里阻塞與非阻塞與是否同步異步無關。跟老板通過什么方式回答你結果無關。

如果是關心阻塞 IO/ 異步 IO, 參考 Unix Network Programming View Book

?

同步異步與阻塞,非阻塞區別1.阻塞/非阻塞, 它們是程序在等待消息(無所謂同步或者異步)時的狀態;2.同步/異步,是程序獲得關注消息通知的機制。同步異步與阻塞,非阻塞組合1.同步阻塞效率最低(日志程序)。2.同步非阻塞效率也不高(需要輪詢)。3.異步阻塞一般模式線程回調。4.異步非阻塞IOCP。

  

舉例

老張愛喝茶,廢話不說,煮開水。出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。 1 老張把水壺放到火上,立等水開。(同步阻塞)老張覺得自己有點傻2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)老張還是覺得自己有點傻,于是變高端了,買了把會響笛的那種水壺。水開之后,能大聲發出嘀~~~~的噪音。 3 老張把響水壺放到火上,立等水開。(異步阻塞)老張覺得這樣傻等意義不大4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞) 老張覺得自己聰明了。

  同步就是燒開水,要自己來看開沒開;異步就是水開了,然后水壺響了通知你水開了。阻塞是燒開水的過程中,你不能干其他事情(即你被阻塞住了);非阻塞是燒開水的過程里可以干其他事情。同步與異步說的是你獲得水開了的方式不同。阻塞與非阻塞說的是的你得到結果之前能不能干其他事情。

?

?

?

?

 

?CPU密集型與IO密集型

CPU密集型(CPU-bound)CPU密集型也叫計算密集型,指的是系統的硬盤、內存性能相對CPU要好很多,此時,系統運作大部分的狀況是CPU Loading 100%,CPU要讀/寫I/O(硬盤/內存),I/O在很短的時間就可以完成,而CPU還有許多運算要處理,CPU Loading很高。在多重程序系統中,大部份時間用來做計算、邏輯判斷等CPU動作的程序稱之CPU bound。例如一個計算圓周率至小數點一千位以下的程序,在執行的過程當中絕大部份時間用在三角函數和開根號的計算,便是屬于CPU bound的程序。CPU bound的程序一般而言CPU占用率相當高。這可能是因為任務本身不太需要訪問I/O設備,也可能是因為程序是多線程實現因此屏蔽掉了等待I/O的時間。
IO密集型(I
/O bound)IO密集型指的是系統的CPU性能相對硬盤、內存要好很多,此時,系統運作,大部分的狀況是CPU在等I/O (硬盤/內存) 的讀/寫操作,此時CPU Loading并不高。I/O bound的程序一般在達到性能極限時,CPU占用率仍然較低。這可能是因為任務本身需要大量I/O操作,而pipeline做得不是很好,沒有充分利用處理器能力。
CPU密集型 vs IO密集型我們可以把任務分為計算密集型和IO密集型。計算密集型任務的特點是要進行大量的計算,消耗CPU資源,比如計算圓周率、對視頻進行高清解碼等等,全靠CPU的運算能力。這種計算密集型任務雖然也可以用多任務完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低,所以,要最高效地利用CPU,計算密集型任務同時進行的數量應當等于CPU的核心數。計算密集型任務由于主要消耗CPU資源,因此,代碼運行效率至關重要。Python這樣的腳本語言運行效率很低,完全不適合計算密集型任務。對于計算密集型任務,最好用C語言編寫。第二種任務的類型是IO密集型,涉及到網絡、磁盤IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低于CPU和內存的速度)。對于IO密集型任務,任務越多,CPU效率越高,但也有一個限度。常見的大部分任務都是IO密集型任務,比如Web應用。IO密集型任務執行期間,
99%的時間都花在IO上,花在CPU上的時間很少,因此,用運行速度極快的C語言替換用Python這樣運行速度極低的腳本語言,完全無法提升運行效率。對于IO密集型任務,最合適的語言就是開發效率最高(代碼量最少)的語言,腳本語言是首選,C語言最差。總之,計算密集型程序適合C語言多線程,I/O密集型適合腳本語言開發的多線程。

?

掛起與阻塞

掛起:一般是主動的,由系統或程序發出,甚至于輔存中去。(不釋放CPU,可能釋放內存,放在外存)阻塞:一般是被動的,在搶占資源中得不到資源,被動的掛起在內存,等待某種資源或信號量(即有了資源)將他喚醒。(釋放CPU,不釋放內存)另外,有一段話很形象:首先這些術語都是對于線程來說的。對線程的控制就好比你控制了一個雇工為你干活。你對雇工的控制是通過編程來實現的。掛起線程的意思就是你對主動對雇工說:“你睡覺去吧,用著你的時候我主動去叫你,然后接著干活”。使線程睡眠的意思就是你主動對雇工說:“你睡覺去吧,某時某刻過來報到,然后接著干活”。線程阻塞的意思就是,你突然發現,你的雇工不知道在什么時候沒經過你允許,自己睡覺呢,但是你不能怪雇工,肯定你 這個雇主沒注意,本來你讓雇工掃地,結果掃帚被偷了或被鄰居家借去了,你又沒讓雇工繼續干別的活,他就只好睡覺了。至于掃帚回來后,雇工會不會知道,會不會繼續干活,你不用擔心,雇工一旦發現掃帚回來了,他就會自己去干活的。因為雇工受過良好的培訓。這個培訓機構就是操作系統。掛 起 進程在操作系統中可以定義為暫時被淘汰出內存的進程,機器的資源是有限的,在資源不足的情況下,操作系統對在內存中的程序進行合理的安排,其中有的進程被暫時調離出內存,當條件允許的時候,會被操作系統再次調回內存,重新進入等待被執行的狀態即就緒態,系統在超過一定的時間沒有任何動作.操作系統為什么要引入掛起狀態?掛起狀態涉及到中級調度,因為當內存中的某個程序需要大的內存空間來執行,但這時內存有沒有空余空間了,那么操作系統就回根據調度算法把一些進程放到外存中去,以騰出空間給正在執行的程序的數據和程序,所以引如了掛起狀態。引起掛起狀態的原因有如下幾方面: (1)終端用戶的請求。當終端用戶在自己的程序運行期間發現有可疑問題時,希望暫停使自己的程序靜止下來。亦即,使正在執行的進程暫停執行;若此時用戶進程正處于就緒狀態而未執行,則該進程暫不接受調度,以便用戶研究其執行情況或對程序進行修改。我們把這種靜止狀態成為“掛起狀態”。 (2)父進程的請求。有時父進程希望掛起自己的某個子進程,以便考察和修改子進程,或者協調各子進程間的活動。 (3)負荷調節的需要。當實時系統中的工作負荷較重,已可能影響到對實時任務的控制時,可由系統把一些不重要的進程掛起,以保證系統能正常運行。 (4)操作系統的需要。操作系統有時希望掛起某些進程,以便檢查運行中的資源使用情況或進行記賬。 (5)對換的需要。為了緩和內存緊張的情況,將內存中處于阻塞狀態的進程換至外存上。下面再說下進程和線程的狀態:進程:一般大家認為是三種狀態:運行、阻塞、就緒。也有分為五態的(多了創建和退出狀態)線程:一般認為是四種狀態:New Thread(not alive)、Runnable Thread(alive)、Blocked Thread(alive)、Dead Thread(not alive)

?

轉載于:https://www.cnblogs.com/-wenli/p/10285074.html

總結

以上是生活随笔為你收集整理的python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...的全部內容,希望文章能夠幫你解決所遇到的問題。

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