【发布时间】:2023-04-02 15:53:01
【问题描述】:
注意:我用谷歌搜索了这个主题,几乎阅读了我能找到的所有内容,但仍然无法获得正确/合理/生产就绪的答案。
基本上所有的答案都是相似的,就像这个:how to stop a groutine,都是相同的模式,没有例外:真正的工作是fmt.Println(1)打印一些东西,或者只是// Do other stuff,
但是如果将实际工作保留在for select default case branch,那么它将被执行多次,打印一些东西是可以的,但显然它还没有准备好进行实际工作。
我能想象的唯一有效方法是将真正的工作放在案例分支上,然后向该案例发送 only 一个 信号以通知它开始,就像这里:playground,但只是感觉想,同样使用这种方法,它是否会产生一些潜在的问题?
添加代码片段以准确显示我想要实现的目标:https://play.golang.org/p/7xjjiW7XdoQ,我想在客户端关闭连接时实现,然后立即终止我的处理程序,释放资源,然后无条件退出。
【问题讨论】:
-
如果您不想多次执行某项操作,请不要这样做。如果您想通过通道接收到的每个值执行一次,那么您的示例可以正常工作。我不确定实际的问题是什么。
-
请注意,在您的示例中,通常只会通过关闭通道来向 goroutine 发出信号:play.golang.org/p/svrXcmiHymx 虽然如果您只打算执行一次,那么尝试某种类型的意义何在取消?
-
使用
sync包(特别是sync.Once)有一些只会执行一次的东西。将其与其他通道逻辑结合使用,以获得一个仅发出一次信号的通道。 -
@Inshi,关键是如果你只执行一次,没有什么可以退出的,因为你可以在工作完成后立即返回。
-
@lnshi,您不能中断阻塞调用。您要么等待它完成,要么重写它以便可以中断它。这就是
Context通常的用途。
标签: go