国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python協(xié)程與golang協(xié)程的區(qū)別

csRyan / 1829人閱讀

摘要:進程線程和協(xié)程進程的定義進程,是計算機中已運行程序的實體。協(xié)程和線程的關系協(xié)程是在語言層面實現(xiàn)對線程的調度,避免了內核級別的上下文消耗。和都引入了消息調度系統(tǒng)模型,來避免鎖的影響和進程線程開銷大的問題。

進程、線程和協(xié)程 進程的定義:

進程,是計算機中已運行程序的實體。程序本身只是指令、數(shù)據(jù)及其組織形式的描述,進程才是程序的真正運行實例。

線程的定義:

操作系統(tǒng)能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。

進程和線程的關系:

一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務。
CPU的最小調度單元是線程不是進程,所以單進程多線程也可以利用多核CPU.

協(xié)程的定義:

協(xié)程通過在線程中實現(xiàn)調度,避免了陷入內核級別的上下文切換造成的性能損失,進而突破了線程在IO上的性能瓶頸。

協(xié)程和線程的關系

協(xié)程是在語言層面實現(xiàn)對線程的調度,避免了內核級別的上下文消耗。

python協(xié)程與調度

Python的協(xié)程源于yield指令。yield有兩個功能:

yield item用于產出一個值,反饋給next()的調用方。

作出讓步,暫停執(zhí)行生成器,讓調用方繼續(xù)工作,直到需要使用另一個值時再調用next()。

import asyncio


async def compute(x, y):
    print("Compute %s + %s ..." % (x, y))
    await asyncio.sleep(x + y)
    return x + y


async def print_sum(x, y):
    result = await compute(x, y)
    print("%s + %s = %s" % (x, y, result))


loop = asyncio.get_event_loop()
tasks = [print_sum(1, 2), print_sum(3, 4)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

協(xié)程是對線程的調度,yield類似惰性求值方式可以視為一種流程控制工具,
實現(xiàn)協(xié)作式多任務,在Python3.5正式引入了 async/await表達式,使得協(xié)程正式在語言層面得到支持和優(yōu)化,大大簡化之前的yield寫法。
線程是內核進行搶占式的調度的,這樣就確保了每個線程都有執(zhí)行的機會。
而 coroutine 運行在同一個線程中,由語言的運行時中的 EventLoop(事件循環(huán))來進行調度。
和大多數(shù)語言一樣,在 Python 中,協(xié)程的調度是非搶占式的,也就是說一個協(xié)程必須主動讓出執(zhí)行機會,其他協(xié)程才有機會運行。
讓出執(zhí)行的關鍵字就是 await。也就是說一個協(xié)程如果阻塞了,持續(xù)不讓出 CPU,那么整個線程就卡住了,沒有任何并發(fā)。

PS: 作為服務端,event loop最核心的就是IO多路復用技術,所有來自客戶端的請求都由IO多路復用函數(shù)來處理;作為客戶端,event loop的核心在于利用Future對象延遲執(zhí)行,并使用send函數(shù)激發(fā)協(xié)程,掛起,等待服務端處理完成返回后再調用CallBack函數(shù)繼續(xù)下面的流程 Go的協(xié)程

Go天生在語言層面支持,和Python類似都是采用了關鍵字,而Go語言使用了go這個關鍵字,可能是想表明協(xié)程是Go語言中最重要的特性。
go協(xié)程之間的通信,Go采用了channel關鍵字。

Go實現(xiàn)了兩種并發(fā)形式:

多線程共享內存。如Java或者C++等在多線程中共享數(shù)據(jù)(例如數(shù)組、Map、或者某個結構體或對象)的時候,通過鎖來訪問.

Go語言特有的,也是Go語言推薦的:CSP(communicating sequential processes)并發(fā)模型。

Go的CSP并發(fā)模型實現(xiàn):M, P, G : [https://www.cnblogs.com/sunsk...]

package main

import (
    "fmt"
)

//Go 協(xié)程(goroutines)和協(xié)程(coroutines)
//Go 協(xié)程意味著并行(或者可以以并行的方式部署),協(xié)程一般來說不是這樣的
//Go 協(xié)程通過通道來通信;協(xié)程通過讓出和恢復操作來通信

// 進程退出時不會等待并發(fā)任務結束,可用通道(channel)阻塞,然后發(fā)出退出信號
func main() {
    jobs := make(chan int)
    done := make(chan bool) // 結束標志

    go func() {
        for {
            j, more := <-jobs //  利用more這個值來判斷通道是否關閉,如果關閉了,那么more的值為false,并且通知給通道done
            fmt.Println("----->:", j, more)
            if more {
                fmt.Println("received job", j)
            } else {
                fmt.Println("end received jobs")
                done <- true
                return
            }
        }
    }()

    go func() {
        for j := 1; j <= 3; j++ {
            jobs <- j
            fmt.Println("sent job", j)
        }
        close(jobs) // 寫完最后的數(shù)據(jù),緊接著就close掉
        fmt.Println("close(jobs)")
    }()

    fmt.Println("sent all jobs")
    <-done // 讓main等待全部協(xié)程完成工作
}

通過在函數(shù)調用前使用關鍵字 go,我們即可讓該函數(shù)以 goroutine 方式執(zhí)行。goroutine 是一種 比線程更加輕盈、更省資源的協(xié)程。
Go 語言通過系統(tǒng)的線程來多路派遣這些函數(shù)的執(zhí)行,使得 每個用 go 關鍵字執(zhí)行的函數(shù)可以運行成為一個單位協(xié)程。
當一個協(xié)程阻塞的時候,調度器就會自 動把其他協(xié)程安排到另外的線程中去執(zhí)行,從而實現(xiàn)了程序無等待并行化運行。
而且調度的開銷非常小,一顆 CPU 調度的規(guī)模不下于每秒百萬次,這使得我們能夠創(chuàng)建大量的 goroutine,
從而可以很輕松地編寫高并發(fā)程序,達到我們想要的目的。 ---- 某書
協(xié)程的4種狀態(tài)

Pending

Running

Done

Cacelled

和系統(tǒng)線程之間的映射關系

go的協(xié)程本質上還是系統(tǒng)的線程調用,而Python中的協(xié)程是eventloop模型實現(xiàn),所以雖然都叫協(xié)程,但并不是一個東西.
Python 中的協(xié)程是嚴格的 1:N 關系,也就是一個線程對應了多個協(xié)程。雖然可以實現(xiàn)異步I/O,但是不能有效利用多核(GIL)。
而 Go 中是 M:N 的關系,也就是 N 個協(xié)程會映射分配到 M 個線程上,這樣帶來了兩點好處:

多個線程能分配到不同核心上,CPU 密集的應用使用 goroutine 也會獲得加速.

即使有少量阻塞的操作,也只會阻塞某個 worker 線程,而不會把整個程序阻塞。

PS: Go中很少提及線程或進程,也就是因為上面的原因. 兩種協(xié)程對比:

async是非搶占式的,一旦開始采用 async 函數(shù),那么你整個程序都必須是 async 的,不然總會有阻塞的地方(一遇阻塞對于沒有實現(xiàn)異步特性的庫就無法主動讓調度器調度其他協(xié)程了),也就是說 async 具有傳染性。

Python 整個異步編程生態(tài)的問題,之前標準庫和各種第三方庫的阻塞性函數(shù)都不能用了,如:requests,redis.py,open 函數(shù)等。所以 Python3.5后加入?yún)f(xié)程的最大問題不是不好用,而是生態(tài)環(huán)境不好,歷史包袱再次上演,動態(tài)語言基礎上再加上多核之間的任務調度,應該是很難的技術吧,真心希望python4.0能優(yōu)化或者放棄GIL鎖,使用多核提升性能。

goroutine 是 go 與生俱來的特性,所以幾乎所有庫都是可以直接用的,避免了 Python 中需要把所有庫重寫一遍的問題。

goroutine 中不需要顯式使用 await 交出控制權,但是 Go 也不會嚴格按照時間片去調度 goroutine,而是會在可能阻塞的地方插入調度。goroutine 的調度可以看做是半搶占式的。

PS: python異步庫列表 [https://github.com/timofurrer...]

Do not communicate by sharing memory; instead, share memory by communicating.(不要以共享內存的方式來通信,相反,要通過通信來共享內存) -- CSP并發(fā)模型


擴展與總結

erlang和golang都是采用了CSP(Communicating Sequential Processes)模式(Python中的協(xié)程是eventloop模型)
但是erlang是基于進程的消息通信,go是基于goroutine和channel的通信。
Python和Go都引入了消息調度系統(tǒng)模型,來避免鎖的影響和進程/線程開銷大的問題。
協(xié)程從本質上來說是一種用戶態(tài)的線程,不需要系統(tǒng)來執(zhí)行搶占式調度,而是在語言層面實現(xiàn)線程的調度。
因為協(xié)程不再使用共享內存/數(shù)據(jù),而是使用通信來共享內存/鎖,因為在一個超級大系統(tǒng)里具有無數(shù)的鎖,
共享變量等等會使得整個系統(tǒng)變得無比的臃腫,而通過消息機制來交流,可以使得每個并發(fā)的單元都成為一個獨立的個體,
擁有自己的變量,單元之間變量并不共享,對于單元的輸入輸出只有消息。
開發(fā)者只需要關心在一個并發(fā)單元的輸入與輸出的影響,而不需要再考慮類似于修改共享內存/數(shù)據(jù)對其它程序的影響。

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

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43738.html

相關文章

  • 談談Python協(xié)程技術的演進

    摘要:事件循環(huán)是異步編程的底層基石。對事件集合進行輪詢,調用回調函數(shù)等一輪事件循環(huán)結束,循環(huán)往復。協(xié)程直接利用代碼的執(zhí)行位置來表示狀態(tài),而回調則是維護了一堆數(shù)據(jù)結構來處理狀態(tài)。時代的協(xié)程技術主要是,另一個比較小眾。 Coding Crush Python開發(fā)工程師 主要負責豈安科技業(yè)務風險情報系統(tǒng)redq。 引言 1.1. 存儲器山 存儲器山是 Randal Bryant 在《深入...

    zhiwei 評論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
  • Python中的協(xié)程

    摘要:協(xié)程的基本行為協(xié)程包含四種狀態(tài)等待開始執(zhí)行。協(xié)程中重要的兩個方法調用方把數(shù)據(jù)提供給協(xié)程。注意使用調用協(xié)程時會自動預激,因此與裝飾器不兼容標準庫中的裝飾器不會預激協(xié)程,因此能兼容句法。因此,終止協(xié)程的本質在于向協(xié)程發(fā)送其無法處理的異常。 導語:本文章記錄了本人在學習Python基礎之控制流程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、掌握協(xié)...

    shinezejian 評論0 收藏0
  • 【宇潤日常瘋測-007】Swoole 協(xié)程與傳統(tǒng) fpm 同步模式比較

    摘要:初識協(xié)程執(zhí)行結果協(xié)程與同步模式比較我們一直在說協(xié)程適合用于密集場景,在同樣的硬件配置環(huán)境下,它會比傳統(tǒng)的同步模式承載更多的訪問量。假設一次查詢?yōu)椋趥鹘y(tǒng)同步模式下,當前進程在這的時間里,是不能做其它操作的。同步模式,耗費左右的是。 如果說數(shù)組是 PHP 的精髓,數(shù)組玩得不6的,根本不能算是會用PHP。那協(xié)程對于 Swoole 也是同理,不理解協(xié)程去用 Swoole,那就是在瞎用。 首先...

    henry14 評論0 收藏0
  • python大佬養(yǎng)成計劃----協(xié)程

    摘要:協(xié)程,又稱微線程,纖程。最大的優(yōu)勢就是協(xié)程極高的執(zhí)行效率。生產者產出第條數(shù)據(jù)返回更新值更新消費者正在調用第條數(shù)據(jù)查看當前進行的線程函數(shù)中有,返回值為生成器庫實現(xiàn)協(xié)程通過提供了對協(xié)程的基本支持,但是不完全。 協(xié)程,又稱微線程,纖程。英文名Coroutine協(xié)程看上去也是子程序,但執(zhí)行過程中,在子程序內部可中斷,然后轉而執(zhí)行別的子程序,在適當?shù)臅r候再返回來接著執(zhí)行。 最大的優(yōu)勢就是協(xié)程極高...

    svtter 評論0 收藏0

發(fā)表評論

0條評論

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