-
Notifications
You must be signed in to change notification settings - Fork 117
Description
当我使用 WithCancel 生成一个 ctx 并将其传递到 Start 进行初始化,然后外部调用 cancel 时ws 没有退出。我检查了 sdk 代码,发现它直接使用 select 进行阻塞而没有接收到退出信号。
这是测试代码
cli := larkws.NewClient("appid", "appkey",
larkws.WithEventHandler(eventHandler),
larkws.WithLogLevel(larkcore.LogLevelDebug),
)
ctx, cancel := context.WithCancel(context.Background())
go func() {
time.Sleep(5 * time.Second)
fmt.Println("5 秒后,停止客户端")
cancel()
}()
err := cli.Start(ctx)
if err!= nil {
panic(err)
}
它没有退出
当我将 sdk 代码更改为以下内容
func (c *Client) Start(ctx context.Context) (err error) {
err = c.connect(ctx)
if err!= nil {
c.logger.Error(ctx, c.fmtLog("连接失败,错误: %v", err)...)
if _, ok := err.(*ClientError); ok {
return
}
c.disconnect(ctx)
if c.autoReconnect {
if err = c.reconnect(ctx); err!= nil {
return err
}
} else {
return err
}
}
go c.pingLoop(ctx)
// 我更改了此处的代码
<-ctx.Done()
c.disconnect(ctx)
err = ctx.Err()
if err == context.Canceled {
err = nil
}
return
}它可以正常退出
请问这是一个Bug吗?或者我该如何控制 ws 客户端退出?
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels