猿问

Golang、App Engine、通道和线程安全

http://blog.golang.org/go-and-google-app-engine

“此外,尽管存在 goroutine 和通道,但当 Go 应用程序在 App Engine 上运行时,在给定实例中仅运行一个线程。也就是说,所有 goroutine 都运行在单个操作系统线程中,因此没有 CPU 并行性可用于给定客户请求。我们预计此限制将在某个时候取消”

那是在 2011 年 5 月。它仍然是真的吗?

我有一个应用程序,它只利用 Golang 的速度;获取一些输入数据,对其执行内存计算,返回结果。永远不要接触数据存储区或任何其他 App Engine API。

我需要应用程序来执行许多计算,理想情况下具有某种程度的并行化。因为我是一个 Golang 菜鸟,所以我只是在没有考虑线程安全的情况下编写了算法。当我一次发送一个请求时,这很有效,但是当我尝试并行发送多个计算时,所有结果都是错误的。我怀疑,但不知道 100%,线程安全是问题所在,尤其是因为算法使用地图,而地图不是线程安全的

http://golang.org/doc/faq#atomic_maps

所以。如何使我的算法线程安全并获得某种程度的并行性。

第一个想法是使用通道,这似乎是线程安全的:

是否可以将 Go 的缓冲通道用作线程安全队列?

但是后来我发现顶部的链接表明频道可能不可用。

所以..如果它们不可用,也许我需要为计算设置一个任务队列,它一次只能执行一个计算。

有人可以启发我了解在 Golang App Engine 上实现一定程度线程安全并行化的最佳模式吗?

谢谢。


浮云间
浏览 223回答 2
2回答

慕哥9229398

Google Appengine 目前只允许一个操作系统线程。了解操作系统线程如何;Goroutines 及其堆栈;和调度器工作,我推荐阅读Scalable Go Scheduler 提案或Go Runtime Scheduler 分析。由于您可以在单个线程上拥有多个通道和 goroutine,因此 Appengine 可以很好地处理concurrency。如果您需要并行性(即不仅运行多个 goroutine,而且在多个处理器上运行它们),那么 Appengine 目前不是答案,因为它的 GOMAXPROCS 设置为 1。就您的特定代码而言,您没有提供任何我们可以查看并帮助调试您的竞争条件的代码。要自己这样做,您可以从阅读这篇关于并使用Go Race Detector 的博客文章中受益

BIG阳

我不知道应用引擎当前是否支持多个操作系统线程,但是即使只有一个操作系统级线程可用,您也绝对可以使用通道。您提供的链接确实声明“存在 goroutine 和通道”,它们只是在一个操作系统级线程中处理。
随时随地看视频慕课网APP

相关分类

Go
我要回答