怎么更进一步学python_【百尺竿头,更进一步学Python】Python进阶课程——进程,线程和协程的区别...
本文帶來各類奇怪的IT百科知識。
【百尺竿頭,更進一步學Python】Python進階課程——進程:線程和協程的區別
現在多進程多線程已經是老生常談了:協程也在最近幾年流行起來。今天我們本文主要介紹進程、線程和協程三者之間的區別。
一、進程:線程和協程的概念
1、進程
進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動
進程是系統進行資源分配和調度的一個獨立單位
每個進程都有自己的獨立內存空間:不同進程通過進程間通信來通信
由于進程比較重要:占據獨立的內存:所以上下文進程間的切換開銷:棧、寄存器、虛擬內存、文件句柄等:比較大:但相對比較穩定安全
2、線程
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位
線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧)
但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源
線程間通信主要通過共享內存:上下文切換很快:資源開銷較少:但相比進程不夠穩定容易丟失數據
3、協程
協程是一種用戶態的輕量級線程:協程的調度完全由用戶控制
協程擁有自己的寄存器上下文和棧
協程調度切換時:將寄存器上下文和棧保存到其他地方:在切回來的時候:恢復先前保存的寄存器上下文和棧:直接操作棧則基本沒有內核切換的開銷:可以不加鎖的訪問全局變量:所以上下文的切換非常快
二、進程:線程和協程的區別
1、進程:線程和協程之間的比較
進程擁有自己獨立的堆和棧:既不共享堆:亦不共享棧:進程由操作系統調度
線程擁有自己獨立的棧和共享的堆:共享堆:不共享棧:線程亦由操作系統調度(標準線程是的)
協程和線程一樣共享堆:不共享棧:協程由程序員在協程的代碼里顯示調度
2、進程與線程比較
線程是指進程內的一個執行單元,也是進程內的可調度實體
線程與進程的區別:
地址空間:線程是進程內的一個執行單元:進程內至少有一個線程:它們共享進程的地址空間:而進程有自己獨立的地址空間
資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
線程是處理器調度的基本單位,但進程不是
二者均可并發執行
每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口:但是線程不能夠獨立執行:必須依存在應用程序中:由應用程序提供多個線程執行控制
3、協程與線程進行比較
協程避免了無意義的調度:由此可以提高性能:但也因此:程序員必須自己承擔調度的責任:同時:協程也失去了標準線程使用多CPU的能力
協程和線程的區別是:
一個線程可以多個協程:一個進程也可以單獨擁有多個協程:這樣python中則能使用多核CPU
線程進程都是同步機制:而協程則是異步
協程能保留上一次調用時的狀態:每次過程重入時:就相當于進入上一次調用的狀態
三、進程:線程和協程在python中的使用
1、進程在python中的使用
多進程一般使用multiprocessing庫:來利用多核CPU:主要是用在CPU密集型的程序上:當然生產者消費者這種也可以使用。
多進程的優勢就是一個子進程崩潰并不會影響其他子進程和主進程的運行:但缺點就是不能一次性啟動太多進程:會嚴重影響系統的資源調度:特別是CPU使用率和負載
2、線程在python中的使用
多線程一般是使用threading庫:完成一些IO密集型并發操作
多線程的優勢是切換快:資源消耗低:但一個線程掛掉則會影響到所有線程:所以不夠穩定
3、協程在python中的使用
協程一般是使用gevent庫:當然這個庫用起來比較麻煩:所以使用的并不是很多
相反:協程在tornado的運用就多得多了:使用協程讓tornado做到單線程異步:據說還能解決C10K的問題。所以協程使用的地方最多的是在web應用上
總結
IO密集型一般使用多線程或者多進程
CPU密集型一般使用多進程
強調非阻塞異步并發的一般都是使用協程
當然有時候也是需要多進程線程池結合的:或者是其他組合方式
進程:線程和協程之間的關系圖示
總結
以上是生活随笔為你收集整理的怎么更进一步学python_【百尺竿头,更进一步学Python】Python进阶课程——进程,线程和协程的区别...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 准确率 召回率_机器学习tips(四):
- 下一篇: 创业阶段如何找客户_初创企业在不同的创业