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