python多線程和多進(jìn)程關(guān)系詳解
在Python的標(biāo)準(zhǔn)庫(kù)中給出了2個(gè)模塊:_thread和threading,_thread是低級(jí)模塊不支持守護(hù)線程,當(dāng)主線程退出了時(shí),全部子線程都會(huì)被強(qiáng)制退出了。而threading是高級(jí)模塊,用作對(duì)_thread進(jìn)行了封裝支持守護(hù)線程。在大部分狀況下人們只需要采用threading這個(gè)高級(jí)模塊即可。
關(guān)于多進(jìn)程的大概講解:多進(jìn)程是multiprocessing模塊給出遠(yuǎn)程與本地的并發(fā),在一個(gè)multiprocessing庫(kù)的采用場(chǎng)景下,全部的子進(jìn)程全是由一個(gè)父進(jìn)程運(yùn)行來(lái)的,這個(gè)父進(jìn)程變成madter進(jìn)程,它會(huì)管理一系列的對(duì)象狀態(tài)下,如果一旦這個(gè)進(jìn)程退出了,子進(jìn)程很可能處在一個(gè)不穩(wěn)定的狀態(tài)下,那么這個(gè)父進(jìn)程盡量要少做事來(lái)維持其穩(wěn)定性
所以python多線程和多進(jìn)程的區(qū)別如下:
多線程中,全部子線程的進(jìn)程號(hào)一樣;多進(jìn)程中,不一樣的子進(jìn)程進(jìn)程號(hào)不一樣
線程共享內(nèi)存空間;進(jìn)程的內(nèi)存是獨(dú)立的
多線程可以共享全局變量,多進(jìn)程做不到
同一個(gè)進(jìn)程的線程之間可以直接交流;2個(gè)進(jìn)程想通信,必須通過(guò)一個(gè)中間代理來(lái)實(shí)現(xiàn)
一個(gè)線程可以控制和操作同一進(jìn)程里的其他線程;但是進(jìn)程只能操作子進(jìn)程
創(chuàng)建新線程很簡(jiǎn)單;創(chuàng)建新進(jìn)程需要對(duì)其父進(jìn)程進(jìn)行一次克隆
內(nèi)容擴(kuò)展:
python多進(jìn)程、多線程之聯(lián)系與區(qū)別
進(jìn)程
概念:進(jìn)程是操作系統(tǒng)分配資源的最小單元
理解:一個(gè)應(yīng)用程序至少包括1個(gè)進(jìn)程,每個(gè)進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,python的多進(jìn)程編程主要依靠multiprocess模塊。
進(jìn)程間通信:首先,進(jìn)程間是可以相互通信的,比較常見(jiàn)的有七種通信方式,如管道pipe、命名管道FIFO、消息隊(duì)列MessageQueue、共享內(nèi)存SharedMemory、信號(hào)量Semaphore、套接字Socket、信號(hào) signal(由于實(shí)際開(kāi)發(fā)涉及較少,這里只作簡(jiǎn)單介紹)但是通常進(jìn)程之間是相互獨(dú)立的,每個(gè)進(jìn)程都有獨(dú)立的內(nèi)存。通過(guò)共享內(nèi)存(nmap模塊),進(jìn)程之間可以共享對(duì)象,使多個(gè)進(jìn)程可以訪問(wèn)同一個(gè)變量(地址相同,變量名可能不同)。多進(jìn)程共享資源必然會(huì)導(dǎo)致進(jìn)程間相互競(jìng)爭(zhēng),所以應(yīng)該盡最大可能防止使用共享狀態(tài)。
線程
概念:線程是操作系統(tǒng)調(diào)度的最小單元
理解:1個(gè)進(jìn)程包括1個(gè)或多個(gè)線程,相比較之下,線程占用資源更少,更高效,且一個(gè)進(jìn)程的多個(gè)線程在執(zhí)行過(guò)程中共享內(nèi)存,毫無(wú)疑問(wèn),線程之間可以相互通信。而python的多進(jìn)程編程主要依靠threading模塊
線程間通信:主要有兩種方式,一種是上鎖,上互斥鎖確保任意時(shí)刻只有一個(gè)線程具備修改全局變量的能力。另一種則是使用消息隊(duì)列,比較經(jīng)典的生產(chǎn)者、消費(fèi)者模型就是這樣,一個(gè)負(fù)責(zé)生成,一個(gè)負(fù)責(zé)消費(fèi),所生成的產(chǎn)品存放在queue里,實(shí)現(xiàn)了不同線程間溝通。
多進(jìn)程跟多線程的區(qū)別
由于進(jìn)程的創(chuàng)建跟銷(xiāo)毀都涉及到系統(tǒng)資源的分配以及回收,導(dǎo)致多進(jìn)程的開(kāi)銷(xiāo)明顯大于多線程的開(kāi)銷(xiāo)。
兩者的應(yīng)用場(chǎng)景
對(duì)CPU密集型代碼(比如循環(huán)計(jì)算) - 多進(jìn)程效率更高
對(duì)IO密集型代碼(比如文件操作,網(wǎng)絡(luò)爬蟲(chóng)) - 多線程效率更高
理由:對(duì)于IO密集型操作,大部分消耗時(shí)間其實(shí)是等待時(shí)間,在等待時(shí)間中CPU是不需要工作的,那你在此期間提供雙CPU資源也是利用不上的,相反對(duì)于CPU密集型代碼,2個(gè)CPU干活肯定比一個(gè)CPU快很多。那么為什么多線程會(huì)對(duì)IO密集型代碼有用呢?這時(shí)因?yàn)閜ython碰到等待會(huì)釋放GIL供新的線程使用,實(shí)現(xiàn)了線程間的切換。
到此這篇關(guān)于python多線程和多進(jìn)程關(guān)系詳解的文章就介紹到這了,更多相關(guān)python多線程和多進(jìn)程之間的聯(lián)系內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. 基于Surprise協(xié)同過(guò)濾實(shí)現(xiàn)短視頻推薦方法示例2. vue-electron中修改表格內(nèi)容并修改樣式3. PHP獲取時(shí)間戳等相關(guān)函數(shù)匯總4. AJAX實(shí)現(xiàn)文件上傳功能報(bào)錯(cuò)Current request is not a multipart request詳解5. 不使用XMLHttpRequest對(duì)象實(shí)現(xiàn)Ajax效果的方法小結(jié)6. 推薦一個(gè)好看Table表格的css樣式代碼詳解7. ASP新手必備的基礎(chǔ)知識(shí)8. ASP常用日期格式化函數(shù) FormatDate()9. 以PHP代碼為實(shí)例詳解RabbitMQ消息隊(duì)列中間件的6種模式10. 微信小程序?qū)崿F(xiàn)商品分類頁(yè)過(guò)程結(jié)束
