成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【node學(xué)習(xí)】協(xié)程

UCloud / 901人閱讀

摘要:協(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

相關(guān)文章

  • 聊聊 2018 年后端技術(shù)趨勢

    摘要:現(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)...

    Miyang 評論0 收藏0
  • 深度學(xué)習(xí)批任務(wù)處理調(diào)度器與kubernetes默認(rèn)調(diào)度器融合

    摘要:這樣就會有一個問題一個任務(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ù)要起...

    xiao7cn 評論0 收藏0
  • 深度學(xué)習(xí)批任務(wù)處理調(diào)度器與kubernetes默認(rèn)調(diào)度器融合

    摘要:這樣就會有一個問題一個任務(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ù)要起...

    dcr309duan 評論0 收藏0
  • 我為什么對 PHP yield 協(xié)程和 swoole 不感冒?

    摘要:最大的優(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)勢形...

    Tychio 評論0 收藏0
  • PyTips 0x13 - Python 線程與協(xié)程(2)

    摘要:項目地址我之前翻譯了協(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 語法是如...

    史占廣 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<