作者yauhh (喲)
看板Programming
標題Re: [問題] Golang iterate callback
時間Fri Oct 10 23:45:06 2014
※ 引述《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://webptt.com/m.aspx?n=bbs/Programming/M.1412955909.A.8E6.html
1F:推 carylorrk: 確實在 go 中的 channel 主要是 1.34.244.41 10/11 01:06
2F:→ carylorrk: 解決 producer consumer problem,第二 1.34.244.41 10/11 01:07
3F:→ carylorrk: 個限制也是因爲認爲 channel 是否結束 1.34.244.41 10/11 01:08
4F:→ carylorrk: 應由 producer 方決定。所以我主要是想 1.34.244.41 10/11 01:09
5F:→ carylorrk: 問在 go 裏是否有更好的做法。只是 go 1.34.244.41 10/11 01:09
6F:→ carylorrk: 沒有專版,所以只好 PO 來這XD 1.34.244.41 10/11 01:09
7F:→ carylorrk: 嗯...正確來說應該是 CSP 本身就很適合 1.34.244.41 10/11 01:10
8F:→ carylorrk: 解決 producer consumer problem 啦 1.34.244.41 10/11 01:11
9F:→ carylorrk: 簡而言之, go 唯一可以自定 range 1.34.244.41 10/11 01:13
10F:→ carylorrk: expression 行爲的只有 channel,但是 1.34.244.41 10/11 01:13
11F:→ carylorrk: 想不到怎麼把 channel 對應到 request 1.34.244.41 10/11 01:14
12F:→ carylorrk: 當然其實最後的做法沒錯,只要在文件上 1.34.244.41 10/11 01:15
13F:→ carylorrk: 註明就好。只是想問有沒有更好的方式 1.34.244.41 10/11 01:15
14F:→ yauhh: 第一個問題的答案,是要設計為 C/S 模型118.160.159.130 10/11 10:33
15F:→ yauhh: producer-consumer只是 C/S 中的一段。118.160.159.130 10/11 10:34
16F:→ yauhh: 什麼叫做把request對應到channel呢?118.160.159.130 10/11 10:35
17F:→ yauhh: 比方說,HTTP連線不就是一個channel118.160.159.130 10/11 10:36
18F:→ yauhh: 所謂request,不就是以client為producer,118.160.159.130 10/11 10:38
19F:→ yauhh: 並且以server為consumer嗎?118.160.159.130 10/11 10:38
20F:→ carylorrk: well...channel 是 go 語言內建的機制 1.34.244.41 10/11 13:48
21F:→ carylorrk: 並不是一種概念或是模型,所以我才說這 1.34.244.41 10/11 13:53
22F:→ carylorrk: 其實算是語言相關的問題 XD|| 1.34.244.41 10/11 13:53
23F:→ yauhh: 不能只自顧自說coroutine是「內建」 175.96.217.184 10/11 22:59
24F:→ yauhh: 問題就是你有這內建的東西卻做不出你要的。 175.96.217.184 10/11 23:00
25F:→ carylorrk: 不是 coroutine,是 goroutine... 1.34.244.41 10/12 12:19
26F:→ carylorrk: 我就是想不到方法無能爲力了才上來問問 1.34.244.41 10/12 12:20
27F:→ carylorrk: 各位前輩高手囉 orz... 1.34.244.41 10/12 12:20
28F:→ carylorrk: 而且有的時候語言限制就是這樣,我現在 1.34.244.41 10/12 12:22
29F:→ carylorrk: 並不是無法實作出所要的功能,只是想問 1.34.244.41 10/12 12:23
30F:→ carylorrk: 有沒有辦法提供更簡單的界面。就像 C++ 1.34.244.41 10/12 12:23
31F:→ carylorrk: 語言沒有 concept 就只能用 static 1.34.244.41 10/12 12:24
32F:→ carylorrk: assert + MACRO 來模擬,或是沒有 1.34.244.41 10/12 12:25
33F:→ carylorrk: static reflection 就只能用其他方法摸 1.34.244.41 10/12 12:26
34F:→ carylorrk: 擬,但是界面就是比較差比較複雜。 1.34.244.41 10/12 12:26
35F:→ carylorrk: go 裏沒有 generic,所以我只能用 1.34.244.41 10/12 12:26
36F:→ carylorrk: runtime reflection 來勉強渡過... 1.34.244.41 10/12 12:27
37F:→ carylorrk: 因爲語言限制而使界面變複雜甚至無法實 1.34.244.41 10/12 12:32
38F:→ carylorrk: 作也不是什麼罕事。我只是覺得想要達到 1.34.244.41 10/12 12:32
39F:→ carylorrk: 用 range 來 iterate result,而且只有 1.34.244.41 10/12 12:33
40F:→ carylorrk: channel + goroutine(都是 go 特有的, 1.34.244.41 10/12 12:33
41F:→ carylorrk: 而非泛指類似的一般化的概念)才能自定 1.34.244.41 10/12 12:34
42F:→ carylorrk: range expression 的行爲,不像 C++ 可 1.34.244.41 10/12 12:34
43F:→ carylorrk: 以自定 iterator,又卡在提到的那兩點 1.34.244.41 10/12 12:35
44F:→ carylorrk: 上。無法確定這是我不熟語言,還是真的 1.34.244.41 10/12 12:36
45F:→ carylorrk: 無法達成或是有更好更符合 go 的idiom 1.34.244.41 10/12 12:36