一 : 科普一分鐘
盡管進(jìn)程間是獨(dú)立存在的,不能相互訪問(wèn)彼此的數(shù)據(jù),但是在python中卻存在進(jìn)程間的通信方法,來(lái)幫助我們可以利用多核CPU也能共享數(shù)據(jù).
對(duì)于多線程其實(shí)也是存在一些缺點(diǎn)的,不是任何場(chǎng)景我們都用多線程來(lái)完成并發(fā)處理任務(wù),因?yàn)镃PU操作線程,所以線程多了,對(duì)于計(jì)算機(jī)的資源消耗是十分嚴(yán)重的,多線程適合IO操作密集的任務(wù),那么怎么辦呢, 協(xié)程的出現(xiàn)幫我們解決了這個(gè)問(wèn)題 ,協(xié)程是比線程更小的一個(gè)單位,但是它的作用卻不容忽視.
二 : 多進(jìn)程
1.多進(jìn)程簡(jiǎn)單了解 :
進(jìn)程之間是獨(dú)立的,是操作系統(tǒng)自己來(lái)維護(hù)和管理的,python通過(guò)C接口起了一個(gè)進(jìn)程,多進(jìn)程可以充分的利用多核CPU
2. 多進(jìn)程的創(chuàng)建 :
3. 多進(jìn)程間的通信 :
進(jìn)程間獨(dú)立,如果想相互訪問(wèn),就必須有一個(gè)中間翻譯,下面提供了幾種進(jìn)程間通信的方法。
進(jìn)程Queue
解析 :
Queue通信,相當(dāng)于父進(jìn)程賦值了一個(gè)Queue給子進(jìn)程,子進(jìn)程在這個(gè)Queue放好數(shù)據(jù)后,序列化一個(gè)中間翻譯,然后在反序列化返回給父進(jìn)程,
因?yàn)檫M(jìn)程之間內(nèi)存獨(dú)立,不能傳遞對(duì)象傳遞的其實(shí)就是序列化的數(shù)據(jù)
Pipe
多進(jìn)程還有一種數(shù)據(jù)傳遞方式叫管道原理和Queue相同
4. 進(jìn)程鎖
雖然內(nèi)存獨(dú)立,但是即使是打印也會(huì)造成打印數(shù)據(jù)錯(cuò)誤,為了防止進(jìn)程間搶屏幕打印輸出,加了進(jìn)程鎖。
5. 進(jìn)程池
創(chuàng)建一個(gè)子進(jìn)程相當(dāng)于copy一份父進(jìn)程內(nèi)存數(shù)據(jù),為了防止頻繁創(chuàng)建,導(dǎo)致內(nèi)存不足,所以有了進(jìn)程池作為限制。
三 : 協(xié)程
1. 協(xié)程的簡(jiǎn)單了解 :
協(xié)程又稱微線程,coroutne,協(xié)程是一種用戶態(tài)的輕量級(jí)線程。通俗點(diǎn)講就是周末我在家里休息,假如我先洗漱,再煮飯,再下載電影看會(huì)很慢,用了協(xié)程的效果就好比,我在下載電影的時(shí)候去點(diǎn)火煮飯,此時(shí)我馬上洗漱,等我洗漱好了,飯也好了,吃完飯了,電影下好了,我可以看了。
2. 協(xié)程的創(chuàng)建和使用:
gevent是一個(gè)三方庫(kù),可以輕松通過(guò)gevent實(shí)現(xiàn)并發(fā)同步或者異步編程。
解析:嘗試運(yùn)行發(fā)現(xiàn),運(yùn)行時(shí)間為Sleep最長(zhǎng)的時(shí)間,也就是說(shuō)協(xié)程能繞過(guò)IO,進(jìn)行執(zhí)行,極大的提高了效率.
IO(從硬盤(pán)上讀一塊數(shù)據(jù),從網(wǎng)絡(luò)讀數(shù)據(jù),從內(nèi)存里讀一塊數(shù)據(jù)) 操作不占用CPU,計(jì)算占用CPU
3. 協(xié)程簡(jiǎn)單爬網(wǎng)頁(yè) :
4. 協(xié)程實(shí)現(xiàn)socketServer:
通過(guò)協(xié)程,我們可以寫(xiě)出一個(gè)socketServer,真正socketServer的底層是用多線程來(lái)實(shí)現(xiàn),我們用寫(xiě)成寫(xiě)出的效率很高,而且非常節(jié)省內(nèi)存
四 : 總結(jié)
協(xié)程的優(yōu)點(diǎn):
線程在單線程下切換,減少資源消耗
無(wú)需原子操作控制流,簡(jiǎn)化編程模型
高并發(fā),高擴(kuò)展,低成本.
無(wú)論是多進(jìn)程,多線程還是協(xié)程在不同的場(chǎng)景用不同的模型才能高效的完成任務(wù).
-
cpu
+關(guān)注
關(guān)注
68文章
11033瀏覽量
215967 -
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86163
原文標(biāo)題:Python篇-多進(jìn)程與協(xié)程的理解與使用
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
談?wù)?b class='flag-5'>協(xié)程的那些事兒

進(jìn)程、線程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!
基于共享內(nèi)存多核數(shù)據(jù)結(jié)構(gòu)研究
Python自動(dòng)化運(yùn)維之協(xié)程函數(shù)賦值過(guò)程
關(guān)于C++ 20協(xié)程最全面詳解

Python后端項(xiàng)目的協(xié)程是什么
Python協(xié)程與JavaScript協(xié)程的對(duì)比及經(jīng)驗(yàn)技巧
使用channel控制協(xié)程數(shù)量
詳解Linux線程、線程與異步編程、協(xié)程與異步
協(xié)程的概念及協(xié)程的掛起函數(shù)介紹
Kotlin協(xié)程實(shí)戰(zhàn)進(jìn)階之筑基篇1

Kotlin協(xié)程實(shí)戰(zhàn)進(jìn)階之筑基篇2

Kotlin協(xié)程實(shí)戰(zhàn)進(jìn)階之筑基篇3
FreeRTOS任務(wù)與協(xié)程介紹
何選擇一個(gè)合適的協(xié)程來(lái)獲得CPU執(zhí)行權(quán)

評(píng)論