亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【node學習】協(xié)程

UCloud / 937人閱讀

摘要:協(xié)程要理解就必須知道一個概念,那就是協(xié)程。基本概念協(xié)程,又成為微線程。但是卻有著很大的區(qū)別協(xié)程是一個線程執(zhí)行。不需要多線程的鎖機制。這也說明協(xié)程的執(zhí)行效率很高一些。

協(xié)程

要理解generator就必須知道一個概念,那就是協(xié)程。

1. 基本概念

協(xié)程,又成為微線程(coroutine)。

進程(process) vs 線程(thread)

我們都知道在操作系統(tǒng)級別上有兩個重要的概念(也是實體):進程(process)和線程(thread),這兩個東西是用于操作系統(tǒng)模擬并行的,在單個CPU上,os通過調度算法,讓CPU輪流執(zhí)行線程或者進程,來達到程序的并發(fā)執(zhí)行。

那么協(xié)程又是什么?首先要明確的是,協(xié)程是編譯器級別的,而并非線程和進程一樣是操作系統(tǒng)級別的。協(xié)程的實現,通過是對某個語言做相應的提議,然后通過后成編譯器標準,然后編譯廠商來實現該機制。

2. 作用

協(xié)程的作用是什么?

簡單來說,就是實現函數的分段式執(zhí)行。就是一個函數的執(zhí)行可以主動放棄CPU的控制權,先掛起,讓其他的函數先執(zhí)行,然后在返回,從上次執(zhí)行結束的地方繼續(xù)執(zhí)行。

這樣看起來很像是多線程輪流執(zhí)行。但是卻有著很大的區(qū)別:協(xié)程是一個線程執(zhí)行。

因為是一個線程執(zhí)行,所以不存在線程的切換,而是由程序自身控制,也就不存在所謂的線程切換的開銷。

不需要多線程的鎖機制。因為只有一個線程,也就不存在同時寫變量的沖突。在協(xié)程中控制共享資源不加鎖,只需要判斷狀態(tài)就好了。這也說明協(xié)程的執(zhí)行效率很高一些。

舉個生產者消費者模型基于搶占式多線程編程的實現(偽代碼)

// 資源,隊列容器
var q = [];

// 消費者進程
loop(); // 循環(huán)等待
lock(q); // 加鎖
var item = getResourceFrom(q); // 獲取資源
unlock(q); // 操作結束,資源解鎖
operatingResource(item);
sleep;

// 生成者線程
loop(); // 循環(huán)等待
var item = createResource(p); // 生產資源
lock(q); // 加鎖
q.push(item); // 寫入資源
unlock(q); // 解鎖

可以看到,以上的代碼中有兩個特點

對資源操作需要進行加鎖和解鎖的操作。(保證線程安全)

消費者線程必須通過sleep,讓出CPU,用于執(zhí)行生產者線程使用。

那么如果是協(xié)程的編程模式,就簡單地多。

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();
    // 我們可以通過代碼來控制其交替執(zhí)行

    // 執(zhí)行到獲取item之前,放棄執(zhí)行權,先執(zhí)行producer(),
    consumerGen.next();
    // 之后可以獲取item,然后再放棄執(zhí)行權,執(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è)設計和學習node。

參考

協(xié)程-廖雪峰

C++ 協(xié)程與網絡編程

談談協(xié)程和C語言的協(xié)程

協(xié)程(Coroutine)并不是真正的多線程

協(xié)程(一)原理

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/80849.html

相關文章

  • 聊聊 2018 年后端技術趨勢

    摘要:現在在后端業(yè)務開發(fā)編程方面,技術力量強的團隊已經開始將技術棧從同步模式切換為異步了。使用這些技術方案是無法兼容已有程序的。影響了異步回調技術棧的普及。將會成為未來后端開發(fā)領域的主流技術方案。 今天太忙,少寫一點,后面再補充。 異步模式 Go 語言越來越熱門,很多大型互聯(lián)網公司后端正在轉向 GO 。Java 圈知名的服務化框架 Dubbo 也宣布轉型異步模式。這是一個大趨勢,異步模式已經...

    Miyang 評論0 收藏0
  • 深度學習批任務處理調度器與kubernetes默認調度器融合

    摘要:這樣就會有一個問題一個任務要起個,每個需要一張卡,總共需要張卡,而集群中只有張空閑的卡,這樣默認的調度器會如何處理因為默認調度器是一個一個調度的,只會檢查單個資源夠不夠,這樣前個都能成功,最后一個調度失敗。 kubernetes集群三步安裝 什么是批處理任務 深度學習中經常會出現多機多卡的任務,也就是同事會起多個pod,但是這多個pod屬于同一個任務。 這樣就會有一個問題 一個任務要起...

    xiao7cn 評論0 收藏0
  • 深度學習批任務處理調度器與kubernetes默認調度器融合

    摘要:這樣就會有一個問題一個任務要起個,每個需要一張卡,總共需要張卡,而集群中只有張空閑的卡,這樣默認的調度器會如何處理因為默認調度器是一個一個調度的,只會檢查單個資源夠不夠,這樣前個都能成功,最后一個調度失敗。 kubernetes集群三步安裝 什么是批處理任務 深度學習中經常會出現多機多卡的任務,也就是同事會起多個pod,但是這多個pod屬于同一個任務。 這樣就會有一個問題 一個任務要起...

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

    摘要:最大的優(yōu)勢在于快速開發(fā),劣勢在于效率和工程規(guī)范。協(xié)程異步這些技術相對學習成本高,優(yōu)勢在于性能提升明顯。的協(xié)程和異步實現的太不優(yōu)雅。有興趣研究協(xié)程的人必然會去對比的甚至的多線程。對比之后就不難發(fā)現,的實現太粗糙了。 離開需求場景談技術是無意義的。PHP 最大的優(yōu)勢在于快速開發(fā),劣勢在于效率和工程規(guī)范。協(xié)程、異步這些技術相對學習成本高,優(yōu)勢在于性能提升明顯。這跟 PHP 語言本身的優(yōu)勢形...

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

    摘要:項目地址我之前翻譯了協(xié)程原理這篇文章之后嘗試用了模式下的協(xié)程進行異步開發(fā),確實感受到協(xié)程所帶來的好處至少是語法上的。 項目地址:https://git.io/pytips 我之前翻譯了Python 3.5 協(xié)程原理這篇文章之后嘗試用了 Tornado + Motor 模式下的協(xié)程進行異步開發(fā),確實感受到協(xié)程所帶來的好處(至少是語法上的:D)。至于協(xié)程的 async/await 語法是如...

    史占廣 評論0 收藏0

發(fā)表評論

0條評論

UCloud

|高級講師

TA的文章

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