摘要:協程要理解就必須知道一個概念,那就是協程。基本概念協程,又成為微線程。但是卻有著很大的區別協程是一個線程執行。不需要多線程的鎖機制。這也說明協程的執行效率很高一些。
協程
要理解generator就必須知道一個概念,那就是協程。
1. 基本概念協程,又成為微線程(coroutine)。
進程(process) vs 線程(thread)
我們都知道在操作系統級別上有兩個重要的概念(也是實體):進程(process)和線程(thread),這兩個東西是用于操作系統模擬并行的,在單個CPU上,os通過調度算法,讓CPU輪流執行線程或者進程,來達到程序的并發執行。
那么協程又是什么?首先要明確的是,協程是編譯器級別的,而并非線程和進程一樣是操作系統級別的。協程的實現,通過是對某個語言做相應的提議,然后通過后成編譯器標準,然后編譯廠商來實現該機制。
2. 作用協程的作用是什么?
簡單來說,就是實現函數的分段式執行。就是一個函數的執行可以主動放棄CPU的控制權,先掛起,讓其他的函數先執行,然后在返回,從上次執行結束的地方繼續執行。
這樣看起來很像是多線程輪流執行。但是卻有著很大的區別:協程是一個線程執行。
因為是一個線程執行,所以不存在線程的切換,而是由程序自身控制,也就不存在所謂的線程切換的開銷。
不需要多線程的鎖機制。因為只有一個線程,也就不存在同時寫變量的沖突。在協程中控制共享資源不加鎖,只需要判斷狀態就好了。這也說明協程的執行效率很高一些。
舉個生產者消費者模型基于搶占式多線程編程的實現(偽代碼)
</>復制代碼
// 資源,隊列容器
var q = [];
// 消費者進程
loop(); // 循環等待
lock(q); // 加鎖
var item = getResourceFrom(q); // 獲取資源
unlock(q); // 操作結束,資源解鎖
operatingResource(item);
sleep;
// 生成者線程
loop(); // 循環等待
var item = createResource(p); // 生產資源
lock(q); // 加鎖
q.push(item); // 寫入資源
unlock(q); // 解鎖
可以看到,以上的代碼中有兩個特點
對資源操作需要進行加鎖和解鎖的操作。(保證線程安全)
消費者線程必須通過sleep,讓出CPU,用于執行生產者線程使用。
那么如果是協程的編程模式,就簡單地多。
</>復制代碼
var q = [];
var count = 0;
// 消費者
function *consumer() {
while (true){
var item = yield producer();
console.log(item);
}
}
// 生產者
function producer() {
q.push(count++);
}
function main () {
const consumerGen = consumer();
// 我們可以通過代碼來控制其交替執行
// 執行到獲取item之前,放棄執行權,先執行producer(),
consumerGen.next();
// 之后可以獲取item,然后再放棄執行權,執行producer,一直循環
consumerGen.next(q.shift()); // 0
consumerGen.next(q.shift()); // 1
consumerGen.next(q.shift()); // 2
consumerGen.next(q.shift()); // 3
consumerGen.next(q.shift()); // 4
consumerGen.next(q.shift()); // 5
}
main();
最后說幾句
好久在這上面寫博客了,最近一直忙于畢業設計和學習node。
參考協程-廖雪峰
C++ 協程與網絡編程
談談協程和C語言的協程
協程(Coroutine)并不是真正的多線程
協程(一)原理
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80849.html
摘要:現在在后端業務開發編程方面,技術力量強的團隊已經開始將技術棧從同步模式切換為異步了。使用這些技術方案是無法兼容已有程序的。影響了異步回調技術棧的普及。將會成為未來后端開發領域的主流技術方案。 今天太忙,少寫一點,后面再補充。 異步模式 Go 語言越來越熱門,很多大型互聯網公司后端正在轉向 GO 。Java 圈知名的服務化框架 Dubbo 也宣布轉型異步模式。這是一個大趨勢,異步模式已經...
摘要:這樣就會有一個問題一個任務要起個,每個需要一張卡,總共需要張卡,而集群中只有張空閑的卡,這樣默認的調度器會如何處理因為默認調度器是一個一個調度的,只會檢查單個資源夠不夠,這樣前個都能成功,最后一個調度失敗。 kubernetes集群三步安裝 什么是批處理任務 深度學習中經常會出現多機多卡的任務,也就是同事會起多個pod,但是這多個pod屬于同一個任務。 這樣就會有一個問題 一個任務要起...
摘要:這樣就會有一個問題一個任務要起個,每個需要一張卡,總共需要張卡,而集群中只有張空閑的卡,這樣默認的調度器會如何處理因為默認調度器是一個一個調度的,只會檢查單個資源夠不夠,這樣前個都能成功,最后一個調度失敗。 kubernetes集群三步安裝 什么是批處理任務 深度學習中經常會出現多機多卡的任務,也就是同事會起多個pod,但是這多個pod屬于同一個任務。 這樣就會有一個問題 一個任務要起...
摘要:最大的優勢在于快速開發,劣勢在于效率和工程規范。協程異步這些技術相對學習成本高,優勢在于性能提升明顯。的協程和異步實現的太不優雅。有興趣研究協程的人必然會去對比的甚至的多線程。對比之后就不難發現,的實現太粗糙了。 離開需求場景談技術是無意義的。PHP 最大的優勢在于快速開發,劣勢在于效率和工程規范。協程、異步這些技術相對學習成本高,優勢在于性能提升明顯。這跟 PHP 語言本身的優勢形...
摘要:項目地址我之前翻譯了協程原理這篇文章之后嘗試用了模式下的協程進行異步開發,確實感受到協程所帶來的好處至少是語法上的。 項目地址:https://git.io/pytips 我之前翻譯了Python 3.5 協程原理這篇文章之后嘗試用了 Tornado + Motor 模式下的協程進行異步開發,確實感受到協程所帶來的好處(至少是語法上的:D)。至于協程的 async/await 語法是如...
閱讀 2861·2021-10-14 09:42
閱讀 3180·2019-08-30 15:52
閱讀 3262·2019-08-30 14:02
閱讀 1112·2019-08-29 15:42
閱讀 536·2019-08-29 13:20
閱讀 1163·2019-08-29 12:24
閱讀 485·2019-08-26 10:20
閱讀 686·2019-08-23 18:31