线程 、进程、协程 三者区别
從計算機硬件角度:
計算機的核心是CPU,承擔了所有的計算任務。
一個CPU,在一個時間切片里只能運行一個程序。
?
從操作系統的角度:
進程和線程,都是一種CPU的執行單元。
進程:表示一個程序的上下文執行活動(打開、執行、保存...)
線程:進程執行程序時候的最小調度單位(執行a,執行b...)
一個程序至少有一個進程,一個進程至少有一個線程。
?
并行 和 并發:
并行:多個CPU核心,不同的程序就分配給不同的CPU來運行。可以讓多個程序同時執行。
cpu1 -------------
cpu2 -------------
cpu3 -------------
cpu4 -------------
并發:單個CPU核心,在一個時間切片里一次只能運行一個程序,如果需要運行多個程序,則串行執行。
cpu1 ---- ----
cpu1? ---- ----
?
多進程/多線程:
表示可以同時執行多個任務,進程和線程的調度是由操作系統自動完成。
進程:每個進程都有自己獨立的內存空間,不同進程之間的內存空間不共享。
進程之間的通信有操作系統傳遞,導致通訊效率低,切換開銷大。
線程:一個進程可以有多個線程,所有線程共享進程的內存空間,通訊效率高,切換開銷小。
共享意味著競爭,導致數據不安全,為了保護內存空間的數據安全,引入"互斥鎖"。
一個線程在訪問內存空間的時候,其他線程不允許訪問,必須等待之前的線程訪問結束,才能使用這個內存空間。
互斥鎖:一種安全有序的讓多個線程訪問內存空間的機制。
?
Python的多線程:
GIL?全局解釋器鎖:線程的執行權限,在Python的進程里只有一個GIL。
一個線程需要執行任務,必須獲取GIL。
好處:直接杜絕了多個線程訪問內存空間的安全問題。
壞處:Python的多線程不是真正多線程,不能充分利用多核CPU的資源。
但是,在I/O阻塞的時候,解釋器會釋放GIL。
所以:
多進程:密集CPU任務,需要充分使用多核CPU資源(服務器,大量的并行計算)的時候,用多進程。 multiprocessing
缺陷:多個進程之間通信成本高,切換開銷大。
多線程:密集I/O任務(網絡I/O,磁盤I/O,數據庫I/O)使用多線程合適。
threading.Thread、multiprocessing.dummy
缺陷:同一個時間切片只能運行一個線程,不能做到高并行,但是可以做到高并發。
協程:又稱微線程,在單線程上執行多個任務,用函數切換,開銷極小。不通過操作系統調度,沒有進程、線程的切換開銷。genvent,monkey.patchall
多線程請求返回是無序的,那個線程有數據返回就處理那個線程,而協程返回的數據是有序的。
缺陷:單線程執行,處理密集CPU和本地磁盤IO的時候,性能較低。處理網絡I/O性能還是比較高.
?
?
?
1. 進程: 通俗理解一個運行起來的程序或者軟件叫做進程
1.1 每次啟動一個進程都需要向操作系統索要運行資源,讓進程中的線程去執行對應的代碼,進程是操作系統分配資源的基本單位
1.2 默認情況下一個進程只有一個線程,線程是依附在進程里面的, 沒有進程就沒有線程, 當在進程里面還可以創建多個線程
1.3 如何理解進程: 把進程想成現實生活中的公司,公司可以給員工提供辦公資源(辦公桌椅,辦公電腦等資源), 真正干活的是員工,所以員工可以想成線程,公司就是進程
2. 進程和線程的對比
2.1 進程是操作系統資源分配的基本單位,每啟動一個進程都需要向操作系統索要運行資源,默認一個進程只有一個線程,線程是依附在進程里面的
2.2 線程是cpu調度的基本單位, 通過線程去執行進程中代碼, 線程是執行代碼的分支
2.3 多進程開發比單進程多線程開發穩定性要強,但是多進程開發比多線程開發資源開銷要大
2.4 多進程開發某個進程死了不會影響其它進程的運行,但是多線程開發該進程死了那么這些線程都要進行銷毀
并發: 任務數大于cpu的核數,多個任務輪流執行,由于cpu切換速度特別快,看起來像是一起運行,其實是假象。
并行:? 任務數小于或者等于cpu的核數,那么多個任務是真正意義一起執行。
3. 進程、線程、協程
1.1 先有進程,然后進程可以創建線程,線程是依附在進程里面的, 線程里面可以包含多個協程
1.2 進程之間不共享全局變量,線程之間共享全局變量,但是要注意資源競爭的問題
1.3 多進程開發比單進程多線程開發穩定性要強,但是多進程開發比多線程開發資源開銷要大
1.4 多線程開發線程之間執行是無序的,協程之間執行按照一定順序交替執行
1.5 協程以后主要用在網絡爬蟲和網絡請求,開辟一個協程大概需要5k空間,開辟一個線程需要512k空間, 開辟一個進程占用資源最多
轉載于:https://www.cnblogs.com/ellisonzhang/p/10470760.html
總結
以上是生活随笔為你收集整理的线程 、进程、协程 三者区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装PHP出现make: *** [sa
- 下一篇: Win10系统下安装VC6.0教程