swoole 當中協程的理解包括(程式、執行緒的講解)

huxiaobai_001發表於2020-03-29

什麼是程式?

程式是系統中正在執行的一個程式,程式一旦執行就是程式。
程式可以看成程式執行的一個例項。程式是系統資源分配的獨立實體,每個程式都擁有獨立的地址空間。一個程式無法訪問另一個程式的變數和資料結構,如果想讓一個程式訪問另一個程式的資源,需要使用程式間通訊,比如管道,檔案,套接字等。

什麼是執行緒?

一個程式可以擁有多個執行緒,每個執行緒使用其所屬程式的棧空間。執行緒與程式的一個主要區別是,統一程式內的一個主要區別是,同一程式內的多個執行緒會共享部分狀態,多個執行緒可以讀寫同一塊記憶體(一個程式無法直接訪問另一程式的記憶體)。同時,每個執行緒還擁有自己的暫存器和棧,其他執行緒可以讀寫這些棧記憶體。
執行緒是程式的一個實體,是程式的一條執行路徑。
執行緒是程式的一個特定執行路徑。當一個執行緒修改了程式的資源,它的兄弟執行緒可以立即看到這種變化

上邊這些話是我從百度到的
接下里我們們用栩栩如生的例子來講明白什麼是程式和執行緒?協程先等等哈,講明白這兩個在下邊再講協程;
譬如以你為首的打架團伙,就是一個程式,
真正出去打架不得有幹活的嗎?
團伙裡面真正打架的這些人就是執行緒 最苦逼的就是執行緒 他得打架啊!
團伙裡面的資料 各個打架成員都是可以共享的 比如今晚去幹張三 他家在新樂大街1999號 他家有三口 還有槍,這些資料在團伙成員當中都是共享的!
但是你這個團伙和另外的大家團伙之間的資料是不能共享的 今晚去要賬大家 你總不能把這事告訴別的打架的團伙吧?
然後我們們再回到swoole當中 手冊裡面講到的worker_num = 4 就是開了幾個打架團伙
程式、執行緒、協程理解
放到swoft2裡面就是bean配置檔案裡面的worker_num
程式、執行緒、協程理解
這裡的worker_num的數值的設定是有要求的,假設你開了4個 worker_num = 4 表示派出去了4個打架團伙 那得有場地啊,總不能4個打架團伙都憋在一個房間裡面幹吧 那不都打亂了嗎!
我們們就假設讓團伙去各個賓館裡面的房間裡幹架,假設我們有1個賓館,這個賓館有4個房間,這個賓館就代表的是cpu,這4個房間就代表的是cpu的核數 那麼在swoole當中這個團隊worker_num的值 = cpu數*核數的一到四倍 最小可以是4最大可以是16個打架團伙
這樣說你應該明白什麼是程式 執行緒 以及理解swoole手冊或者swoft2裡面講到的worker_num的含義了吧?
再不理解請訪問“程式設計師在囧途”加群讓我師傅幫你點化點化吧!

什麼是協程?

之前寫過一篇部落格 放到csdn上了 https://blog.csdn.net/weixin_39166924/arti...
當然部落格裡面也沒寫的多麼的清晰
協程比較抽象 它是程式內部的一定排程機制 就跟打架一樣 這個worker得要告訴大家怎麼打 是2打一 還是1打1 還是3打一 還是你來先打他一個然後你三個再去打他一個 這是一種排程機制 程式內部自己決定的 比如小三去打對方的李二,打不過了 程式會執行排程機制讓胖五去幹對方的李二,調取機制 比較抽象吧?如果是單純的執行緒化的可能cpu就安排五個打五個了 萬一一個打不過就被幹死了 就是阻塞了!
程的特點在於是一個執行緒執行,那和多執行緒比,協程有何優勢?
最大的優勢就是協程極高的執行效率。因為子程式切換不是執行緒切換,而是由程式自身控制,因此,沒有執行緒切換的開銷,和多執行緒比,執行緒數量越多,協程的效能優勢就越明顯。
第二大優勢就是不需要多執行緒的鎖機制,因為只有一個執行緒,也不存在同時寫變數衝突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比多執行緒高很多。
因為協程是一個執行緒執行,那怎麼利用多核CPU呢?最簡單的方法是多程式+協程,既充分利用多核,又充分發揮協程的高效率,可獲得極高的效能。
協程並不是切換的執行緒 而是切的自身內部的程式!
通俗的說,協程就是一段段協作方式執行的程式,協作來完成一件事,協作就是協同作業。我們知道團隊協同來做事,比個人單獨來做事,效率肯定要高,因為團隊協同可以發揮各成員的能動性、優勢互補。這是拿人來比喻。我們拿做事來比喻舉個例子:比如我們做飯,比如有以下環節洗菜、切菜、燒水、炒菜、煮米飯,人作為主體來操作,那麼如果按部就班的做,先燒水,再洗菜,在切菜,再炒菜,再煮飯,那這頓飯要做很長時間比如總共30分鐘吧,如果我們通過協同方式,先燒水,放灶火上就可以做其他洗菜、切菜的準備,再煮米飯,然後再來洗菜、切菜,再檢視煮米飯,再炒菜,…,如此迴圈往復切換,最後水燒好,米飯也煮好了,菜也炒好了,飯也OK了,這樣我們耗時可能只有10-15分鐘,看到了嗎,這就是生活中的“協程”,由人來合理排程安排不同的環節,充分利用各種不同的資源和時間,來達到提高效率。協程是計算機程式,呼叫的則是不同的程式,處理者主要由CPU完成,處理物件是各種IO資源,處理的方式是不同的語言編寫的程式。我們知道,CPU可以排程不同的程式,讓程式呼叫不同的IO資源,最初的程式是通過CPU頻繁的切換來完成呼叫程式的,是作業系統按一定演算法分配的時間片搶佔被動方式來切換的,未考慮程式實際執行狀況,這樣切換程式會帶來一定問題,而協程作為一種新的工作模式,可以讓程式協作方式來執行,在需要使用CPU時,交給程式處理,遇到耗時的IO資源操作時會讓出CPU,交給處理其他程式,這樣互相協作來執行,而不是搶佔式的,就像交通規則,大家都遵守按一定規則禮讓先行,不隨便搶道,協同方式,程式都會執行的良好。
————————————————
版權宣告:本文為CSDN博主「胡小白001」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/weixin_39166924/arti...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

胡軍

相關文章