golang中,协程之间通信的方式除了channel还有啥?

ddxx11223 · 2017-11-29 08:25:03 · 3068 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-11-29 08:25:03 的主题,其中的信息可能已经有所发展或是发生改变。

先撇掉共享内存这个方式,我要在各个goroutine之间传递数据,除了用channel还有别的方法嘛?

还有个问题,channel稳定吗?会不会出线数据丢失的情况,因为现在的场景是这一条数据丢了就永远丢了,所以害怕高并发下大规模使用channel的话有数据丢失就麻烦了


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3068 次点击  
加入收藏 微博
8 回复  |  直到 2017-12-08 01:50:59
admin87
admin87 · #1 · 7年之前

chan最好。可以设置缓存大小。自动组塞。不用chan就用安全列队 自己写

ddxx11223
ddxx11223 · #2 · 7年之前
admin87admin87 #1 回复

chan最好。可以设置缓存大小。自动组塞。不用chan就用安全列队 自己写

好的,谢谢啦

admin87
admin87 · #3 · 7年之前
ddxx11223ddxx11223 #2 回复

#1楼 @admin87 好的,谢谢啦

我也是新手,等等,看看有没有帮神有别人办法

yanjinbin-del
yanjinbin-del · #4 · 7年之前

没了 go没有JAVA的内存屏障模型 只有CSP

dekenis
dekenis · #5 · 7年之前

go里有一句话,要用通信来共享内存(数据),不要通过共享内存来通信。 线程之间,是因为有资源需要共享,才产生了通信 用channel耗资源更低,不要自己用内存去共享,go提供的channel非常方便

ddxx11223
ddxx11223 · #6 · 7年之前
dekenisdekenis #5 回复

go里有一句话,要用通信来共享内存(数据),不要通过共享内存来通信。 线程之间,是因为有资源需要共享,才产生了通信 用channel耗资源更低,不要自己用内存去共享,go提供的channel非常方便

你这么一说,我好像总算理解了这句话了 “要用通信来共享内存(数据),不要通过共享内存来通信”。关键在于把前半句的内存换成数据,就好理解了。 但是数据放到channel和从channel中pop出来,应该都是走的拷贝吧?而不是引用?

dekenis
dekenis · #7 · 7年之前
ddxx11223ddxx11223 #6 回复

#5楼 @dekenis 你这么一说,我好像总算理解了这句话了 “要用通信来共享内存(数据),不要通过共享内存来通信”。关键在于把前半句的内存换成数据,就好理解了。 但是数据放到channel和从channel中pop出来,应该都是走的拷贝吧?而不是引用?

channel是引用,看传参就知道了。 <- 这个符号是channel的读写,读了就pop,写了就push

yc90s
yc90s · #8 · 7年之前

context

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传