专业的编程技术博客社区

网站首页 > 博客文章 正文

非阻塞的Go channel(非阻塞的症状)

baijin 2024-10-03 17:26:57 博客文章 8 ℃ 0 评论

go chan 提供了一种新的共享内存方式, 使用通信来共享内存,而不是使用共享内存来通信(), 使用起来非常简单

c := make(chan int)

<- c

<- c 会阻塞到有数据有数据写入c时才会取消阻塞

那么如何非阻塞地从 chan 中读取数据? go 提供了 select, 可以实现非阻塞读取数据

select {
case <-c :
default:
}

?

当没有default 时, select 是阻塞的,添加default后,如果 c 里面没有数据, select 会立即结束.

如果想等待 <-c 一段时间(如1秒), 有数据写入或超时后再结束,可以使用time.After

?

select {
case <-c:
case <-time.After(time.Second):
}

time.After 会生成一个 <-chan Time, 如果 c 一直没有数据写入,select 会阻塞到 <-chan Time 超时后结束

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表