当前位置: 首页 > 面试题库 >

在Go中取消阻止操作

孔鸿宝
2023-03-14
问题内容

我在我无法控制的第三方库中执行阻止操作。它有可能永远消失。所以我想设置一个超时时间。最明显的方法是用一个通道和一个goroutine包装它,然后用选择结果time.After。但是,问题是运行阻塞操作的goroutine可能永远消失。

这是一个示例来说明此html" target="_blank">http://repl.it/90o

有没有办法取消goroutine或将其收集为垃圾?


问题答案:

您无法从“外部”停止goroutine。goroutine必须支持某种终止信令(通常是信道)。但是,如果不这样做,您将无法强制执行或杀死它。

如果您对正在使用的第三方库无能为力,那么您最多可以做的就是在一个可以杀死的不同进程(在由go应用启动的另一个应用程序中)中运行它,但这仅仅是丑陋又太笨重。



 类似资料:
  • 问题内容: 我有一个执行以下代码的线程: 哪里是。如何才能优雅地停止此类线程?关闭或使用均无效。 问题答案: 这是因为读取System.in(InputStream)是一项阻塞操作。 在这里看是否可以从InputStream读取超时? 这是一种从System.in获取NIO FileChannel并使用超时检查数据可用性的方法,这是问题中所述问题的特例。在控制台上运行它,不要键入任何输入,然后等待

  • 我在使用spring WebSockets时遇到以下错误: 用例:在我们的服务器端代码中,我们有一个在数据库中搜索值的功能。如果这些值不在数据库中。它将访问servlet并获取数据。第二部分,即访问servlet并获取数据是异步调用。 因此,对于一个请求,我们必须在数据库中搜索多个内容… 示例:在request中,我们得到了一个参数channel:1这个channel映射到多个ID,比如1映射到1

  • 有什么方法可以阻止Kafka的消费者在一段时间内消费信息吗?我希望消费者停止一段时间,然后开始消费最后一条未消费的消息。

  • 我有一个简单的Kafka消费者微服务应用程序,它使用来自某个主题的消息,同一个应用程序运行在两个不同的池中。 所以,当消息由制作人生成,而我的应用程序尝试使用来自主题的消息时,它只被一个池中的一个人使用。 如何停止从消费者Kafka读取并发消息。我想在两个池中使用相同的消息。 这种情况下可能的解决方案是什么

  • 问题内容: 我对Go如何处理非阻塞IO感到困惑。API在我看来基本上是同步的,并且在Go上观看演示时,听到诸如“和调用块”之类的注释并不罕见。 从文件或网络读取时,Go是否使用阻塞IO?还是当在Go Routine中使用某种魔术来重写代码? 来自C#背景,这感觉非常不直观,在C#中,当使用异步API时我们使用了关键字。这清楚地表明,API可以产生当前线程,并在以后的延续中继续。 因此,TLDR;当

  • 问题内容: 我编写了以下程序: 由于通道事件列表是一个缓冲通道,我想我应该获得100倍的输出“嘿!”,但是它只显示一次。我的错误在哪里? 问题答案: 更新(Go 1.2版或更高版本) 从Go 1.2开始,调度程序基于 抢先式多任务处理 原则。这意味着原始问题(以及下面提供的解决方案)中的问题不再相关。 从Go 1.2发行说明中 调度程序中的抢占 在以前的版本中,永远循环的goroutine可能会使