Python的Generator和Go的ConcurrencyPattern有什么聯(lián)系嗎

這篇文章主要講解了“Python的Generator和Go的Concurrency Pattern有什么聯(lián)系嗎”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Python的Generator和Go的Concurrency Pattern有什么聯(lián)系嗎”吧!

站在用戶的角度思考問題,與客戶深入溝通,找到霍爾果斯網(wǎng)站設(shè)計(jì)與霍爾果斯網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋霍爾果斯地區(qū)。

Python 的 generator 和 Go 的 goroutine 都是常用的技法。沒看到有人分析其間關(guān)系,所以在此記錄一下。

這兩個(gè)概念都是為了 producer-consumer 模式的編程方便發(fā)明的。Python 的 generator 和 iterator 以及  iterable objects 一脈相承。Go 出現(xiàn)比 Python 晚,解決同樣的編程便捷性問題,用 channel 和 goroutine  兩個(gè)概念。

Go 的做法

Go 的做法比較容易理解,因?yàn)楹徒滩睦锏母拍钜恢拢簆roducer 和 consumer 各自是一個(gè) goroutine,而一個(gè) goroutine  是一種 green thread —— 自己放棄執(zhí)行,讓其他 gorotine 有機(jī)會(huì)占用 CPU,而不依賴一個(gè) preemption 機(jī)制(比如 OS  kernel)來(lái)強(qiáng)制休眠當(dāng)前 thread 以騰出 CPU 給其他 thread。

producer 把數(shù)據(jù)寫入一個(gè) channel,consumer 從這個(gè) channel 里讀。一個(gè) channel 就是一個(gè) blocking  queue,可以有一個(gè) buffer。讀可以通過 loop 語(yǔ)法。比如

package main  func producer(n int) chan int {     ch := make(chan int)     go func() { // This goroutine is the producer         for i := 0; i < n; i++ {             ch <- i         }         close(ch)     }()     return ch }  func main() { // the main goroutine is the consumer     for i := range producer(5) {         println(i)     } }

請(qǐng)注意,上述寫法讓一個(gè) Go 函數(shù)創(chuàng)建和返回一個(gè) channel,同時(shí)這個(gè) Go 函數(shù)啟動(dòng)一個(gè)“發(fā)射后不管”的 producer goroutine &mdash;&mdash;  這是標(biāo)準(zhǔn) Go 做法,不太符合 C/C++ 的習(xí)俗 &mdash;&mdash; (1)創(chuàng)建 channel(2)啟動(dòng) producer 和 consumer threads。這是因?yàn)? C/C++ 不支持 high-order functions,或者叫 functionals。具體請(qǐng)參見我的這個(gè)回答 什么是函數(shù)式編程思維? 這個(gè) Go  pattern 和 Python 習(xí)俗一致,因?yàn)檫@倆都是 functional programming languages。

Python 的做法

上述 Go 的 producer 非常接近 Python 的 generator 的寫法 &mdash;&mdash; 兩點(diǎn)區(qū)別,都是 Python 解釋器代勞的結(jié)果:

  • Python 用戶不需要?jiǎng)?chuàng)建和關(guān)閉 channel 了。

  • ch <- i 這一行可以用 yield i 來(lái)代替。

對(duì)應(yīng)的 Python generator 如下

from typing import Iterator  def producer(n: int) -> Iterator[int]:   for i in range(n):     yield i  for i in producer(5):   print(i)

比較

Python 的 producer 不是一個(gè)函數(shù),因?yàn)槔锩鏇]有 return,而是一個(gè) generator,因?yàn)槔锩嬗? yield。一個(gè)函數(shù)返回一個(gè)值。而一個(gè) generator 返回一個(gè) iterator。

Go 的 producer 是一個(gè)函數(shù),返回一個(gè) channel。Go 里沒有 generator 這樣的“新概念”。

上面 Python generator 里的代碼和 Go producer 里啟動(dòng)的 goroutine 的代碼幾乎完全一樣,只是把 ch <- i  換成了 yield i。

那么 Python generator 返回的 iterator 到底是個(gè)啥呢?其實(shí)就是那個(gè) Go channel,或者叫 blocking queue  的。從這個(gè)角度看,Python generator 又是一個(gè)函數(shù)了,返回一個(gè) blocking queue。

Python 里最常用的 generator 莫過于 range &mdash;&mdash; 上例中也出現(xiàn)了。所以上例中,其實(shí)調(diào)用 range 的時(shí)候,已經(jīng)創(chuàng)建了一個(gè)  Python thread 往 range 返回的 blocking queue 里寫數(shù)字。而 producer 只是從這個(gè) queue 里取出數(shù)字,再  yield 到 producer 創(chuàng)建的第二個(gè) queue 里,讓 for i in producer(5) 這一行(由 main thread  執(zhí)行)去讀。

這樣一串三個(gè) Python threads,通過兩個(gè) queues 連成一串,就是 Rob Pike 在著名幻燈片  https://talks.golang.org/2012/concurrency.slide#1 里展示 Go concurrency pattern 里的  pipeline:

Python的Generator和Go的Concurrency Pattern有什么聯(lián)系嗎

不過這里有一個(gè)區(qū)別,goroutines 是可以并行執(zhí)行的,如果我們電腦里有多個(gè) CPU cores。不過,Python threads 雖然就是 OS  thread 卻受制于 Python 的 GIL,所以任何時(shí)候只有一個(gè) Python 在執(zhí)行中,即使我們有很多 CPU  cores。請(qǐng)看https://www.zhihu.com/pin/1343421894465474560

Occam's Razor

我們?cè)O(shè)計(jì)系統(tǒng)的時(shí)候經(jīng)常需要遵循一個(gè)哲學(xué)原則 Occam's Razor &mdash;&mdash;  能達(dá)到目的的各種手段里我們選擇最簡(jiǎn)單的那個(gè)。這也是本專欄名字的由來(lái)。在漢語(yǔ)里,這個(gè)原則(philosophical  principle)叫“刪繁就簡(jiǎn)三秋樹”。如果做不到,必然積累還不完的技術(shù)債,以至于不可能“領(lǐng)異標(biāo)新二月花”。

對(duì)比上面 Go 和 Python 兩個(gè)例子,顯然 Python 例子的代碼更簡(jiǎn)單。那么是不是就說(shuō)明 Python 語(yǔ)言的設(shè)計(jì)比 Go 更加符合  Occam's Razor 的原則了呢?

恐怕并不盡然。雖然 Python 代碼簡(jiǎn)短,但是需要用戶理解更多概念(generator,iterator,以及它們和 functions 以及  queues 的潛在關(guān)系)&mdash;&mdash; 這也是一種開銷。

感謝各位的閱讀,以上就是“Python的Generator和Go的Concurrency Pattern有什么聯(lián)系嗎”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Python的Generator和Go的Concurrency Pattern有什么聯(lián)系嗎這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

本文標(biāo)題:Python的Generator和Go的ConcurrencyPattern有什么聯(lián)系嗎
轉(zhuǎn)載來(lái)于:http://muchs.cn/article8/ghedip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT品牌網(wǎng)站設(shè)計(jì)、App設(shè)計(jì)、網(wǎng)站營(yíng)銷、云服務(wù)器、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司