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