作者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/cn.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