【问题标题】:How to properly use Golang packages in the standard library or third-party with Goroutines?如何正确使用标准库或第三方中的 Golang 包与 Goroutines?
【发布时间】:2013-06-06 01:22:06
【问题描述】:

嗨,Golang 程序员,

首先,如果我的问题最初不是很清楚,我深表歉意,但我在编写使用标准库或其他库时使用 Goroutines 的 Golang 代码时试图了解正确的使用模式。

让我详细说明一下:假设我导入了一些我没有亲笔编写但想要使用的包。假设这个包以某种方式向 Flickr 等网站发出简单的 http get 请求。如果我想要一个并发请求,我可以在函数调用前加上 go 关键字。但是我怎么知道,这个包在执行请求时并没有自己做一些内部 go 调用,因此使我的 go 调用变得多余?

Golang 包通常会在文档中说他们的方法是“绿色的”吗?或者他们提供了两种版本的方法,一种是绿色的,一种是直接同步的?

在我寻求理解 Go 习惯用法和使用模式的过程中,我什至在使用标准库中的包时感觉我无法确定我的 go 命令是否必要。我想我可以分析调用,或者编写测试代码,但是必须弄清楚一个 func 是否已经是“绿色”,这感觉很奇怪。

我想另一种可能性是,由我来研究我正在使用的任何东西的源代码,并了解它应该如何使用以及是否需要 go 关键字。

如果有人能对此有所了解或将我指向正确的文档甚至是 Golang 截屏视频,我将不胜感激。我认为 Rob Pike 在一次演讲中简要提到过,一个好的客户端 api 编写的 go 只是以典型的同步方式编写的,由该 api 的调用者决定是否将其设为绿色。

感谢您的宝贵时间,

-拉尔夫

【问题讨论】:

    标签: go goroutine


    【解决方案1】:

    如果一个函数/方法返回一些值,或者有类似的副作用 (io.Reader.Read) - 那么它必然是一个同步的东西。除非另有说明,否则不应假设多个 goroutine 并发使用是不安全的。

    如果它接受一个闭包(回调)或一个通道,或者如果它返回一个通道——那么它通常是一个异步的东西。如果是这种情况,通常是显而易见的或明确记录在案的。像这样的异步东西通常对于多个 goroutine 并发使用是安全的。

    【讨论】:

    • http.Get 在 http 包中返回 *Response、错误值并且是同步的,我没有在文档中看到它说在 goroutines 中使用它是安全的,但我可以通过包装它一个匿名的 go func(){} 并因此获得将此调用与 goroutine 一起使用的好处。我错过了什么?这是 http.get 上的包文档:golang.org/pkg/net/http/#Get
    • Get是http.Client的一个方法。 Client 类型的文档声明它可以安全地被多个 goroutine 并发使用。
    • 这是一个合理的答案,但术语“同步”和“异步”在这里没有帮助。重要的一点是某些 API 函数是有状态的(或基于状态的序列的一部分),因此不应在多个 go-routine 之间共享。 Go 的标语是“不要通过共享内存进行通信,而是通过通信来共享内存”。上面的第二段令人困惑:如果使用通道,就会有并发,这就是需要注意的地方。这是同步还是异步无关紧要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多