摘要:在一個進程內部,要同時干多件事,就需要同時運行多個子任務,我們把進程內的這些子任務稱為線程。總結一下,多任務的實現方式有三種多進程模式多線程模式多進程多線程模式線程是最小的執行單元,而進程由至少一個線程組成。
進程與線程
很多同學都聽說過,現代操作系統比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任務”的操作系統。
什么叫“多任務”呢?簡單地說,就是操作系統可以同時運行多個任務。打個比方,你一邊在用瀏覽器上網,一邊在聽MP3,一邊在用Word趕作業,這就是多任務,至少同時有3個任務正在運行。還有很多任務悄悄地在后臺同時運行著,只是桌面上沒有顯示而已。
現在,多核CPU已經非常普及了,但是,即使過去的單核CPU,也可以執行多任務。由于CPU執行代碼都是順序執行的,那么,單核CPU是怎么執行多任務的呢?
答案就是操作系統輪流讓各個任務交替執行,任務1執行0.01秒,切換到任務2,任務2執行0.01秒,再切換到任務3,執行0.01秒……這樣反復執行下去。表面上看,每個任務都是交替執行的,但是,由于CPU的執行速度實在是太快了,我們感覺就像所有任務都在同時執行一樣。
真正的并行執行多任務只能在多核CPU上實現,但是,由于任務數量遠遠多于CPU的核心數量,所以,操作系統也會自動把很多任務輪流調度到每個核心上執行。
對于操作系統來說,一個任務就是一個進程(Process),比如打開一個瀏覽器就是啟動一個瀏覽器進程,打開一個記事本就啟動了一個記事本進程,打開兩個記事本就啟動了兩個記事本進程,打開一個Word就啟動了一個Word進程。 有些進程還不止同時干一件事,比如Word,它可以同時進行打字、拼寫檢查、打印等事情。在一個進程內部,要同時干多件事,就需要同時運行多個“子任務”,我們把進程內的這些“子任務”稱為線程(Thread)。 由于每個進程至少要干一件事,所以,一個進程至少有一個線程。當然,像Word這種復雜的進程可以有多個線程,多個線程可以同時執行,多線程的執行方式和多進程是一樣的,也是由操作系統在多個線程之間快速切換,讓每個線程都短暫地交替運行,看起來就像同時執行一樣。當然,真正地同時執行多線程需要多核CPU才可能實現。
我們前面編寫的所有的Python程序,都是執行單任務的進程,也就是只有一個線程。
如果我們要同時執行多個任務怎么辦?
有兩種解決方案:
一種是啟動多個進程,每個進程雖然只有一個線程,但多個進程可以一塊執行多個任務。
還有一種方法是啟動一個進程,在一個進程內啟動多個線程,這樣,多個線程也可以一塊執行多個任務。
當然還有第三種方法,就是啟動多個進程,每個進程再啟動多個線程,這樣同時執行的任務就更多了,當然這種模型更復雜,實際很少采用。
總結一下,多任務的實現方式有三種:
多進程模式
多線程模式
多進程+多線程模式
線程是最小的執行單元,而進程由至少一個線程組成。如何調度進程和線程,完全由操作系統決定,程序自己不能決定什么時候執行,執行多長時間。
多進程和多線程的程序涉及到同步、數據共享的問題,編寫起來更復雜。
無論是并行還是并發,在用戶看來都是同時運行的,不管是進程還是線程,都只是一個任務而已,
真正干活的是CPU,CPU來做這些任務,而一個cpu(單核)同一時刻只能執行一個任務。
并行:多個任務同時運行,只有具備多個cpu才能實現并行,含有幾個cpu,也就意味著在同一時刻可以執行幾個任務。
并發:是偽并行,即看起來是同時運行的,實際上是單個CPU在多道程序之間來回的進行切換。
同步就是指一個進程在執行某個請求的時候,若該請求需要一段時間才能返回信息,那么這個進程將會一直等待下去,直到收到返回信息才繼續執行下去。
異步是指進程不需要一直等下去,而是繼續執行下面的操作,不管其他進程的狀態。當有消息返回時系統會通知進行處理,這樣可以提高執行的效率。
打電話的過程就是同步通信,發短信時就是異步通信。
子進程創建后,父進程和子進程有各自不同的地址空間,多道技術要求物理層面實現進程之間內存的
隔離,任何一個進程在其地址空間的修改都不會影響到另外一個進程。
注意:子進程和父進程之間是可以有只讀的共享的內存區域的。
進程與進程之間數據(資源)是隔離的,兩個進程之間可以基于管道這種方式進行通信。在Unix當中,是含有進程層次的概念的,但是在windows當中,是沒有進程層次的概念的,所有的進程都是地位相同的。
在Linux當中,每啟動一個命令,都會啟動一個進程。
在其他語言當中,一個進程里面開啟多個線程,每個線程都可以給一個cpu去使用,但是在
python當中,在同一時刻,一個進程當中只能有一個線程處于運行狀態。
eg:在其他語言當中,比如我現在開啟了一個進程,這個進程當中含有幾個線程,如果我現在有多個cpu,每一個線程是可以對應相應的CPU的。
但是在python當中,如果我們現在開啟了一個進程,這個進程里面對應多個線程,同一時刻只有一個線程可以處于運行狀態。
對于其他語言而言,在多CPU系統中,為了最大限度的利用多核,可以開啟多個線程。
但是Python中的多線程是利用不了多核優勢的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42437.html
摘要:申明守護線程需要在開啟線程之前。線程池線程都是后臺線程。每個線程都使用默認的堆棧大小,以默認的優先級運行,并處于多線程單元中。 創建線程 一個進程必有一個線程,進程也可由多個線程組成,但有一個線程為主線程。若一個任務需要花10Mins,當只有一個線程時,花費10Mins,當有十個線程時,可能就花費1Mins,所以多線程可以提升任務執行時間,提高工作效率。python里與線程有關的模塊:...
摘要:多進程執行任務結束,創建進程和銷毀進程是時間的,如果長度不夠,會造成多線程快過多進程多線程執行任務結束,進程間通信生產者消費者模型與隊列演示了生產者和消費者的場景。 進程 Python是運行在解釋器中的語言,查找資料知道,python中有一個全局鎖(GIL),在使用多進程(Thread)的情況下,不能發揮多核的優勢。而使用多進程(Multiprocess),則可以發揮多核的優勢真正地提...
摘要:協程,又稱微線程,纖程。最大的優勢就是協程極高的執行效率。生產者產出第條數據返回更新值更新消費者正在調用第條數據查看當前進行的線程函數中有,返回值為生成器庫實現協程通過提供了對協程的基本支持,但是不完全。 協程,又稱微線程,纖程。英文名Coroutine協程看上去也是子程序,但執行過程中,在子程序內部可中斷,然后轉而執行別的子程序,在適當的時候再返回來接著執行。 最大的優勢就是協程極高...
摘要:協程實現連接在網絡通信中,每個連接都必須創建新線程或進程來處理,否則,單線程在處理連接的過程中,無法接受其他客戶端的連接。所以我們嘗試使用協程來實現服務器對多個客戶端的響應。 協程實現TCP連接 在網絡通信中,每個連接都必須創建新線程(或進程) 來處理,否則,單線程在處理連接的過程中, 無法接受其他客戶端的連接。所以我們嘗試使用協程來實現服務器對多個客戶端的響應。與單一TCP通信的構架...
摘要:分布式進程在和中,應當優選,因為更穩定,而且,可以分布到多臺機器上,而最多只能分布到同一臺機器的多個上。由于模塊封裝很好,不必了解網絡通信的細節,就可以很容易地編寫分布式多進程程序。 分布式進程 在Thread和Process中,應當優選Process,因為Process更穩定,而且,Process可以分布到多臺機器上,而Thread最多只能分布到同一臺機器的多個CPU上。 Pytho...
閱讀 2042·2021-11-19 11:37
閱讀 732·2021-11-11 16:54
閱讀 1181·2021-11-02 14:44
閱讀 3084·2021-09-02 15:40
閱讀 2384·2019-08-30 15:44
閱讀 972·2019-08-29 11:17
閱讀 1074·2019-08-26 14:06
閱讀 1568·2019-08-26 13:47