【发布时间】:2014-10-30 09:27:23
【问题描述】:
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
所以。如何使我的算法线程安全并获得一定程度的并行性。
首先想到的是使用通道,这似乎是线程安全的:
Is it possible to use Go's buffered channel as a thread-safe queue?
但后来我发现顶部的链接表明频道可能不可用。
所以..如果它们不可用,也许我需要为计算设置一个任务队列,一次只能执行一个计算。
有人能告诉我在 Golang App Engine 上实现一定程度的线程安全并行化的最佳模式吗?
谢谢。
【问题讨论】:
-
不知道是不是这个,但是任何全局变量仍然可以被多个 goroutine 更新,即使 GOMAXPROCS=1。如果你真的不需要全局变量来协调多个任务,那就让它们不再是全局的——也许将它们移动到你为每个请求分配的结构中。这个问题是一个非常笼统的描述,所以很难说更多。
标签: google-app-engine go