golang里面有没有针对read非阻塞的channel?除了超时机制

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

比如

var c = make(chan int, 1)

func test() {
    for {
        tmp: <-c
        fmt.Println("如果c是非阻塞,我会一直被循环打印")
    }
}

func main() {
    c<- 6  //这一步是往管道里写,是非阻塞的,因为设了缓冲
    test()  //那么从管道里读呢,能直接非阻塞吗,我意思是说即使把缓冲读完了,依旧要非阻塞
}

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

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

2231 次点击  
加入收藏 微博
10 回复  |  直到 2017-11-14 06:01:39
polaris
polaris · #1 · 7年之前

channel 的特性就是这样的

mortemnh
mortemnh · #2 · 7年之前

select配合 default

polaris
polaris · #3 · 7年之前

@mortemnh 这种方式可行,不知道是不是楼主要的

ddxx11223
ddxx11223 · #4 · 7年之前
mortemnhmortemnh #2 回复

select配合 default

select配合default,确实可以达到那个效果,但是channel本身还是阻塞的,看起来golang的channel没法设成NonBlock

ddxx11223
ddxx11223 · #5 · 7年之前
polarispolaris #1 回复

channel 的特性就是这样的

好吧,知道了,谢谢

admin87
admin87 · #6 · 7年之前

你可以判断一下C的数量

ddxx11223
ddxx11223 · #7 · 7年之前
admin87admin87 #6 回复

你可以判断一下C的数量

你是说管道中元素的数量?

mortemnh
mortemnh · #8 · 7年之前
ddxx11223ddxx11223 #4 回复

#2楼 @mortemnh select配合default,确实可以达到那个效果,但是channel本身还是阻塞的,看起来golang的channel没法设成NonBlock

chan的数据结构体本身设计就是阻塞的,你要非阻塞的自己自定义一个结构就可以了;阻塞结构设计比非阻塞结构难。chan不是高级结构体是基础结构体,本身功能就要足够单一

ddxx11223
ddxx11223 · #9 · 7年之前
mortemnhmortemnh #8 回复

#4楼 @ddxx11223 chan的数据结构体本身设计就是阻塞的,你要非阻塞的自己自定义一个结构就可以了;阻塞结构设计比非阻塞结构难。chan不是高级结构体是基础结构体,本身功能就要足够单一

ok

admin87
admin87 · #10 · 7年之前
ddxx11223ddxx11223 #7 回复

#6楼 @admin87 你是说管道中元素的数量?

对的,if len(c)>0{}

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