Re: [問題] Golang iterate callback

看板Programming作者 (喲)時間10年前 (2014/10/10 23:45), 編輯推噓1(1044)
留言45則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《carylorrk (Cary)》之銘言: : C++ 可以自定 iterator, 在 golang 想到用 channel 達到類似功能的做法 : http://ideone.com/YwgBm4 : 這樣的界面對使用者最方便,combine 裏可以直接 iterate result : 但是會有兩個問題: : 1. 每次會先做完下一個, send to channel 時才卡住,我希望的是如果沒有讀就不要做 : 2. combiner 中途離開時沒有辦法很好的關閉 goroutine... : 雖然可以直接關掉 channel 然後做 recover,但是感覺很不好XD : 目前我想到的方法是把 callback wrap 起來給 combiner 呼叫 : http://ideone.com/tQ7mbu : 不過這樣 combiner 裏需要使用者自己呼叫才能得到結果 : 不知道有沒有更好的處理方式? 我覺得,應該是你沒把計算模型設定好。本來的計算模型是 producer-to-consummer (我自己發明的詞彙,不要去google),所以你程式是先做出資料,丟出去,然後 下一段流程才去處理資料。 而你需要的計算模型,應該是 request-response 。 接收資料的一端,是 request end 。發送資料的一端則是 response end 。 所以, iterator 是一個 data server ,等待 combiner 下達需求,才開始做。 這一部分是關於你的第一個問題。 至於第二個問題,一來是隨著你目前的計算模型而存在,二來,要看在這種偶合力 比較高的計算模型中,是否有機制可以讓 combiner 中途結束之前,拋出一個訊息給 iterator ,讓它也打算收工。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.160.159.130 ※ 文章網址: http://www.ptt.cc/bbs/Programming/M.1412955909.A.8E6.html

10/11 01:06, , 1F
確實在 go 中的 channel 主要是
10/11 01:06, 1F

10/11 01:07, , 2F
解決 producer consumer problem,第二
10/11 01:07, 2F

10/11 01:08, , 3F
個限制也是因爲認爲 channel 是否結束
10/11 01:08, 3F

10/11 01:09, , 4F
應由 producer 方決定。所以我主要是想
10/11 01:09, 4F

10/11 01:09, , 5F
問在 go 裏是否有更好的做法。只是 go
10/11 01:09, 5F

10/11 01:09, , 6F
沒有專版,所以只好 PO 來這XD
10/11 01:09, 6F

10/11 01:10, , 7F
嗯...正確來說應該是 CSP 本身就很適合
10/11 01:10, 7F

10/11 01:11, , 8F
解決 producer consumer problem 啦
10/11 01:11, 8F

10/11 01:13, , 9F
簡而言之, go 唯一可以自定 range
10/11 01:13, 9F

10/11 01:13, , 10F
expression 行爲的只有 channel,但是
10/11 01:13, 10F

10/11 01:14, , 11F
想不到怎麼把 channel 對應到 request
10/11 01:14, 11F

10/11 01:15, , 12F
當然其實最後的做法沒錯,只要在文件上
10/11 01:15, 12F

10/11 01:15, , 13F
註明就好。只是想問有沒有更好的方式
10/11 01:15, 13F

10/11 10:33, , 14F
第一個問題的答案,是要設計為 C/S 模型
10/11 10:33, 14F

10/11 10:34, , 15F
producer-consumer只是 C/S 中的一段。
10/11 10:34, 15F

10/11 10:35, , 16F
什麼叫做把request對應到channel呢?
10/11 10:35, 16F

10/11 10:36, , 17F
比方說,HTTP連線不就是一個channel
10/11 10:36, 17F

10/11 10:38, , 18F
所謂request,不就是以client為producer,
10/11 10:38, 18F

10/11 10:38, , 19F
並且以server為consumer嗎?
10/11 10:38, 19F

10/11 13:48, , 20F
well...channel 是 go 語言內建的機制
10/11 13:48, 20F

10/11 13:53, , 21F
並不是一種概念或是模型,所以我才說這
10/11 13:53, 21F

10/11 13:53, , 22F
其實算是語言相關的問題 XD||
10/11 13:53, 22F

10/11 22:59, , 23F
不能只自顧自說coroutine是「內建」
10/11 22:59, 23F

10/11 23:00, , 24F
問題就是你有這內建的東西卻做不出你要的。
10/11 23:00, 24F

10/12 12:19, , 25F
不是 coroutine,是 goroutine...
10/12 12:19, 25F

10/12 12:20, , 26F
我就是想不到方法無能爲力了才上來問問
10/12 12:20, 26F

10/12 12:20, , 27F
各位前輩高手囉 orz...
10/12 12:20, 27F

10/12 12:22, , 28F
而且有的時候語言限制就是這樣,我現在
10/12 12:22, 28F

10/12 12:23, , 29F
並不是無法實作出所要的功能,只是想問
10/12 12:23, 29F

10/12 12:23, , 30F
有沒有辦法提供更簡單的界面。就像 C++
10/12 12:23, 30F

10/12 12:24, , 31F
語言沒有 concept 就只能用 static
10/12 12:24, 31F

10/12 12:25, , 32F
assert + MACRO 來模擬,或是沒有
10/12 12:25, 32F

10/12 12:26, , 33F
static reflection 就只能用其他方法摸
10/12 12:26, 33F

10/12 12:26, , 34F
擬,但是界面就是比較差比較複雜。
10/12 12:26, 34F

10/12 12:26, , 35F
go 裏沒有 generic,所以我只能用
10/12 12:26, 35F

10/12 12:27, , 36F
runtime reflection 來勉強渡過...
10/12 12:27, 36F

10/12 12:32, , 37F
因爲語言限制而使界面變複雜甚至無法實
10/12 12:32, 37F

10/12 12:32, , 38F
作也不是什麼罕事。我只是覺得想要達到
10/12 12:32, 38F

10/12 12:33, , 39F
用 range 來 iterate result,而且只有
10/12 12:33, 39F

10/12 12:33, , 40F
channel + goroutine(都是 go 特有的,
10/12 12:33, 40F

10/12 12:34, , 41F
而非泛指類似的一般化的概念)才能自定
10/12 12:34, 41F

10/12 12:34, , 42F
range expression 的行爲,不像 C++ 可
10/12 12:34, 42F

10/12 12:35, , 43F
以自定 iterator,又卡在提到的那兩點
10/12 12:35, 43F

10/12 12:36, , 44F
上。無法確定這是我不熟語言,還是真的
10/12 12:36, 44F

10/12 12:36, , 45F
無法達成或是有更好更符合 go 的idiom
10/12 12:36, 45F
文章代碼(AID): #1KD_y5Zc (Programming)
討論串 (同標題文章)
文章代碼(AID): #1KD_y5Zc (Programming)