python多線程和多進(jìn)程關(guān)系詳解
關(guān)于多線程的大概講解:
在Python的標(biāo)準(zhǔn)庫中給出了2個模塊:_thread和threading,_thread是低級模塊不支持守護(hù)線程,當(dāng)主線程退出了時,全部子線程都會被強(qiáng)制退出了。而threading是高級模塊,用作對_thread進(jìn)行了封裝支持守護(hù)線程。在大部分狀況下人們只需要采用threading這個高級模塊即可。
關(guān)于多進(jìn)程的大概講解:
多進(jìn)程是multiprocessing模塊給出遠(yuǎn)程與本地的并發(fā),在一個multiprocessing庫的采用場景下,全部的子進(jìn)程全是由一個父進(jìn)程運(yùn)行來的,這個父進(jìn)程變成madter進(jìn)程,它會管理一系列的對象狀態(tài)下,如果一旦這個進(jìn)程退出了,子進(jìn)程很可能處在一個不穩(wěn)定的狀態(tài)下,那么這個父進(jìn)程盡量要少做事來維持其穩(wěn)定性
所以python多線程和多進(jìn)程的區(qū)別如下:
多線程中,全部子線程的進(jìn)程號一樣;多進(jìn)程中,不一樣的子進(jìn)程進(jìn)程號不一樣
線程共享內(nèi)存空間;進(jìn)程的內(nèi)存是獨(dú)立的
多線程可以共享全局變量,多進(jìn)程做不到
同一個進(jìn)程的線程之間可以直接交流;2個進(jìn)程想通信,必須通過一個中間代理來實(shí)現(xiàn)
一個線程可以控制和操作同一進(jìn)程里的其他線程;但是進(jìn)程只能操作子進(jìn)程
創(chuàng)建新線程很簡單;創(chuàng)建新進(jìn)程需要對其父進(jìn)程進(jìn)行一次克隆
內(nèi)容擴(kuò)展:
python多進(jìn)程、多線程之聯(lián)系與區(qū)別
進(jìn)程
概念:進(jìn)程是操作系統(tǒng)分配資源的最小單元
理解:一個應(yīng)用程序至少包括1個進(jìn)程,每個進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,python的多進(jìn)程編程主要依靠multiprocess模塊。
進(jìn)程間通信:首先,進(jìn)程間是可以相互通信的,比較常見的有七種通信方式,如管道pipe、命名管道FIFO、消息隊(duì)列MessageQueue、共享內(nèi)存SharedMemory、信號量Semaphore、套接字Socket、信號 signal(由于實(shí)際開發(fā)涉及較少,這里只作簡單介紹)但是通常進(jìn)程之間是相互獨(dú)立的,每個進(jìn)程都有獨(dú)立的內(nèi)存。通過共享內(nèi)存(nmap模塊),進(jìn)程之間可以共享對象,使多個進(jìn)程可以訪問同一個變量(地址相同,變量名可能不同)。多進(jìn)程共享資源必然會導(dǎo)致進(jìn)程間相互競爭,所以應(yīng)該盡最大可能防止使用共享狀態(tài)。
線程
概念:線程是操作系統(tǒng)調(diào)度的最小單元
理解:1個進(jìn)程包括1個或多個線程,相比較之下,線程占用資源更少,更高效,且一個進(jìn)程的多個線程在執(zhí)行過程中共享內(nèi)存,毫無疑問,線程之間可以相互通信。而python的多進(jìn)程編程主要依靠threading模塊
線程間通信:主要有兩種方式,一種是上鎖,上互斥鎖確保任意時刻只有一個線程具備修改全局變量的能力。另一種則是使用消息隊(duì)列,比較經(jīng)典的生產(chǎn)者、消費(fèi)者模型就是這樣,一個負(fù)責(zé)生成,一個負(fù)責(zé)消費(fèi),所生成的產(chǎn)品存放在queue里,實(shí)現(xiàn)了不同線程間溝通。
多進(jìn)程跟多線程的區(qū)別
由于進(jìn)程的創(chuàng)建跟銷毀都涉及到系統(tǒng)資源的分配以及回收,導(dǎo)致多進(jìn)程的開銷明顯大于多線程的開銷。
兩者的應(yīng)用場景
對CPU密集型代碼(比如循環(huán)計算) - 多進(jìn)程效率更高
對IO密集型代碼(比如文件操作,網(wǎng)絡(luò)爬蟲) - 多線程效率更高
理由:對于IO密集型操作,大部分消耗時間其實(shí)是等待時間,在等待時間中CPU是不需要工作的,那你在此期間提供雙CPU資源也是利用不上的,相反對于CPU密集型代碼,2個CPU干活肯定比一個CPU快很多。那么為什么多線程會對IO密集型代碼有用呢?這時因?yàn)閜ython碰到等待會釋放GIL供新的線程使用,實(shí)現(xiàn)了線程間的切換。
到此這篇關(guān)于python多線程和多進(jìn)程關(guān)系詳解的文章就介紹到這了,更多相關(guān)python多線程和多進(jìn)程之間的聯(lián)系內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 分析詳解python多線程與多進(jìn)程區(qū)別
- 手把手帶你了解python多進(jìn)程,多線程
- Python多進(jìn)程共享numpy 數(shù)組的方法
- 總結(jié)python多進(jìn)程multiprocessing的相關(guān)知識
- Python多線程與多進(jìn)程相關(guān)知識總結(jié)
- python實(shí)現(xiàn)多進(jìn)程并發(fā)控制Semaphore與互斥鎖LOCK
- python 多進(jìn)程和多線程使用詳解
- python 實(shí)現(xiàn)多進(jìn)程日志輪轉(zhuǎn)ConcurrentLogHandler
- Python多進(jìn)程與多線程的使用場景詳解
- python多進(jìn)程執(zhí)行方法apply_async使用說明
- Python 多進(jìn)程原理及實(shí)現(xiàn)
- Python多進(jìn)程的使用詳情
相關(guān)文章
Python獲取當(dāng)前頁面內(nèi)所有鏈接的四種方法對比分析
這篇文章主要介紹了Python獲取當(dāng)前頁面內(nèi)所有鏈接的方法,結(jié)合實(shí)例形式對比分析了Python常用的四種獲取頁面鏈接的方法,并附帶了iframe框架內(nèi)鏈接的獲取方法,需要的朋友可以參考下2017-08-08
Pytorch深度學(xué)習(xí)之實(shí)現(xiàn)病蟲害圖像分類
PyTorch是一個開源的Python機(jī)器學(xué)習(xí)庫,基于Torch,用于自然語言處理等應(yīng)用程序。它具有強(qiáng)大的GPU加速的張量計算和自動求導(dǎo)系統(tǒng)的深度神經(jīng)網(wǎng)絡(luò)。本文將介紹如何通過PyTorch實(shí)現(xiàn)病蟲害圖像分類,感興趣的可以學(xué)習(xí)一下2021-12-12
用python標(biāo)準(zhǔn)庫difflib比較兩份文件的異同詳解
今天小編就為大家分享一篇用python標(biāo)準(zhǔn)庫difflib比較兩份文件的異同詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
使用Python獲取CPU、內(nèi)存和硬盤等windowns系統(tǒng)信息的2個例子
這篇文章主要介紹了使用Python獲取CPU、內(nèi)存和硬盤等windowns系統(tǒng)信息的2個例子,使用的python wmi模塊,需要的朋友可以參考下2014-04-04
基于python的BP神經(jīng)網(wǎng)絡(luò)及異或?qū)崿F(xiàn)過程解析
這篇文章主要介紹了基于python的BP神經(jīng)網(wǎng)絡(luò)及異或?qū)崿F(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
pandas string轉(zhuǎn)dataframe的方法
下面小編就為大家分享一篇pandas string轉(zhuǎn)dataframe的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
python實(shí)現(xiàn)tail實(shí)時查看服務(wù)器日志示例
今天小編就為大家分享一篇python實(shí)現(xiàn)tail實(shí)時查看服務(wù)器日志示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12

