Go 锁定一个呼叫直到另一个呼叫完成

Go 锁定一个呼叫直到另一个呼叫完成,go,Go,你好,我有一个go func中的代码 as.client, err = getConnection(hostname, port)) if err != nil { return nil, err } as.session, err = as.client.NewSession() if err != nil { return nil, err } 不幸的是,它似乎出错了,因为它在创建客户端之前就开始调用NewSession。我可以在这些调用之间添加一个time.Sleep,

你好,我有一个go func中的代码

as.client, err = getConnection(hostname, port))
if err != nil {
    return nil, err
}

as.session, err = as.client.NewSession()
if err != nil {
    return nil, err
}

不幸的是,它似乎出错了,因为它在创建客户端之前就开始调用NewSession。我可以在这些调用之间添加一个time.Sleep,这样可以修复它,但是有没有更好的方法来使用互斥或回调函数呢?我该怎么做呢?

在这里使用互斥或回调将是一种过于复杂的黑客行为


为避免混淆和数据争用,
getConnection
应仅在设置返回值后返回控件。如果这是一个第三方库,那么应该有一个文档来解释为什么它不这样做,并且可能提供一些如何正确使用函数的提示

这里有几件事你可以做

  • 使
    getConnection()
    synchronous,即只在创建客户端后返回控制。您可以在此函数中使用来阻止
  • getConnection()
    还可以返回一个频道并在其上发布内容 那频道一旦完成。然后,调用方可以从 在创建客户机之前,阻止通道自身

  • 这个
    getConnection
    函数是在完全初始化它返回的值之前返回的吗?如果是这种情况,你需要修复它。它是一个第三方库@BurakSerdarIt,在你发布的代码中是一个未报告的函数,所以你要么在它周围有一个包装器,要么你没有发布实际的代码。在任何情况下,
    getConnection
    都不应该返回一个值并在单独的goroutine中继续设置它,或者应该提供一种检查完成情况的方法。没有这些,就有一个围绕<代码>的数据竞争,如客户机<代码>,行为是不确定的,没有可靠的方法来修复它。我们看不到足够的代码来真正地识别和解决这个问题,但是考虑使用<代码> Syc。曾经< /代码>曾经运行过第三方函数,同时让每个调用方等待该函数运行完成一次。