初级会员
  • 第 74351 位会员
  • visli
  • 2022-06-28 15:24:51
  • Offline
  • 19 62

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • str.WriteString(fmt.Sprintf("%v", v))
  • #3 @xwszt 谢谢回复。1、Keys(),Set()方法超时后,会返回相应的error, 由调用的函数再来做相应的处理,只是上面代码我省掉没写出来。2、redis也可能会超时的,比如网络异常了。另外这个场景其实也可以换用操作普通关系型数据库来考虑。
  • #1 @xwszt 这里其实已是真正要使用了,避免每次操作不会超时,一旦超时就做超时处理。所以用TODO()或Backgroud()来占位已不合适了。
  • @buscoop 最终方案就是1楼的办法。 另外,我最初的这个方案,似乎也不会报race问题,这是令我困惑的。 ``` func NewSrv() { ln, err := net.ListenTCP() defer ln.Close() ... go func() { <- exitChann ln.Close() } for { c, err:= ln.Accept() .... } } ```
  • @xwszt</a> , 最初是用channel来通知关闭的。外部goroutine close掉这个channel来通知。但这样需要在创建listener的协程中另起一个协程来监听这个channel。多个listener就起了多个监听的协程,感觉浪费。 大致代码如下: ``` func NewSrv() { ln, err := net.ListenTCP() defer ln.Close() ... go func() { <- exitChann ln.Close() } for { c, err:= ln.Accept() .... } } ``` 现在改成了1楼的建议: ``` func NewSrv() { ln, err := net.ListenTCP() defer ln.Close() ... for { select { case <- exitChann: return default: ln.SetDeadlin() c, err := ln.Accept() .... } } } ```" name="content" class="comment-textarea" rows="8" style="width: 100%;"><a href="/user/xwszt" title="@xwszt">@xwszt</a> , 最初是用channel来通知关闭的。外部goroutine close掉这个channel来通知。但这样需要在创建listener的协程中另起一个协程来监听这个channel。多个listener就起了多个监听的协程,感觉浪费。 大致代码如下: ``` func NewSrv() { ln, err := net.ListenTCP() defer ln.Close() ... go func() { <- exitChann ln.Close() } for { c, err:= ln.Accept() .... } } ``` 现在改成了1楼的建议: ``` func NewSrv() { ln, err := net.ListenTCP() defer ln.Close() ... for { select { case <- exitChann: return default: ln.SetDeadlin() c, err := ln.Accept() .... } } } ``` 问题的关键是listener非线程安全的,但又不好用加锁等方法来做同步