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

WaitGroup.Wait()的超时

岳景明
2023-03-14
问题内容

将超时分配给WaitGroup.Wait()的惯用方式是什么?

我要这样做的原因是为了保护我的“调度员”免于永远等待错误的“工人”。这就引出了一些哲学问题(例如,一旦有错误的工作人员,系统如何才能可靠地继续?),但我认为这超出了这个问题的范围。

我将提供一个答案。现在,我已将其写下来,它似乎还不错,但仍然感觉比应有的更复杂。我想知道是否有一些更简单,更惯用的方法,甚至是不使用WaitGroups的替代方法。

助教。


问题答案:

通常,您在下面发布的解决方案都可以得到最好的解决方案。改善的几个技巧:

  • 或者,您可以关闭通道以完成信号,而不是在通道上发送值,关闭通道上的接收操作始终可以立即进行。
  • 并且最好使用defer语句来表示完成,即使函数突然终止,它也会被执行。
  • 同样,如果只有一个“作业”要等待,则可以完全省略,WaitGroup而仅在作业完成时发送一个值或关闭通道(在select语句中使用相同的通道)。
  • 指定持续1秒很简单,只要:timeout := time.Second。例如,指定2秒为:timeout := 2 * time.Second。您不需要转换,time.Second它已经是type了time.Duration,将其与未类型化的常量相乘,就像这样,2也会产生type的值time.Duration

我还将创建包装此功能的帮助程序/实用程序功能。请注意,WaitGroup必须将其作为指针传递,否则副本将不会“通知”
WaitGroup.Done()调用。就像是:

// waitTimeout waits for the waitgroup for the specified max timeout.
// Returns true if waiting timed out.
func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool {
    c := make(chan struct{})
    go func() {
        defer close(c)
        wg.Wait()
    }()
    select {
    case <-c:
        return false // completed normally
    case <-time.After(timeout):
        return true // timed out
    }
}

使用它:

if waitTimeout(&wg, time.Second) {
    fmt.Println("Timed out waiting for wait group")
} else {
    fmt.Println("Wait group finished")
}

在Go Playground上尝试一下。



 类似资料:
  • 我期待关于Kakfa主题的消息,一旦我收到消息,我就会发出关于新主题的消息。我使用streams API来实现这一点,它很简单。但是,由于系统不可靠,我可能永远不会接收到,但如果已经接收到消息的(例如),并且在秒内没有记录新消息,我仍然希望发出消息。这在Kafka streams中是可能的吗?还是我需要为它写一个consumer? 如果Kafka Streams有类似于Rx(http://reac

  • JUnit中带有@Test注释的测试可以以毫秒为单位设置超时,例如: 然而,我似乎找不到一种方法来设置超时(或@BeforeClass)。 还有其他明智的方法吗?我想知道@BeforeClass是否有某种原因不能超时? 我想这样做: 编辑:添加“静态”

  • 我使用pysnmp用Python测试了SNMP GET命令的以下代码 当我使用localhost或127.0.0.1运行它时,它可以工作,但当我使用计算机的IP时,会出现超时错误。 我还测试了我在Java(snmp4j)中找到的一个示例,它与Java(snmp4j)是一样的:它可以与本地主机和127.0.0.1一起工作,但不能与IP一起工作。如果我对IP进行ping,它就会工作,所以我不明白为什么

  • 当我们所有数据库的 SQL 语句是通过子查询方式完成,对于超时的控制往往很容易被大家忽略。因为大家在代码里看不到任何调用 set_timeout 的地方。实际上 PostgreSQL 已经为我们预留好了两个设置。 请参考下面这段配置: location /postgres { internal; default_type text/html; set_by_lua_blo

  • 你是否正遇到网络或 CPU 的瓶颈? 验证客户端和托管redis-server的服务器上支持的最大带宽。如果有请求被带宽限制,则它们需要更长时间才能完成,从而可能导致超时。 同样,验证您没有在客户端或服务器框上获得CPU限制,这将导致请求等待CPU时间,从而超时。 有没有命令需要在 redis 服务器上处理很长时间? 可能有一些命令需要很长时间才能在redis服务器上处理,导致请求超时。 长时间

  • 套房级 套件级超时可应用于整个测试“套件”,或通过其禁用this.timeout(0)。这将由所有嵌套套件和不覆盖该值的测试用例继承。 describe('a suite of tests', function() { this.timeout(500); it('should take less than 500ms', function(done){ setTimeout(done, 30