http://blog.golang.org/go-and-google-app-engine
“此外,虽然存在goroutines和channel,但是当App app在App Engine上运行时,在给定的实例中只运行一个线程。也就是说,所有goroutine都在一个操作系统线程中运行,因此没有CPU并行性可用于给定的客户请求。我们预计此限制将在某个时候解除“
那是在2011年5月。它仍然是真的吗?
我有一个应用程序除了利用Golang的速度之外什么都不做;获取一些输入数据,对其执行内存计算,返回结果。切勿触摸数据存储区或任何其他App Engine API。
我需要应用程序执行许多计算,理想情况下需要一定程度的并行化。因为我是一个Golang noob,所以我只是编写了算法,而没有考虑到线程的安全性。当我一次发送一个请求时,这很好用,但是当我尝试并行发送多个计算时,所有结果都是错误的。我怀疑,但不知道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上实现一定程度的线程安全并行化的最佳模式吗?
感谢。
答案 0 :(得分:1)
Google Appengine目前只允许一个操作系统线程。
了解操作系统线程的方式; Goroutines和他们的筹码;和调度程序一样,我建议您阅读the Scalable Go Scheduler proposal或Analysis of the Go Runtime Scheduler。
由于你可以在一个线程上拥有多个通道,goutoutine,因此并发可以使用Appengine。如果你需要 parallelism (即不仅运行多个goroutine,而是在多个处理器上运行它们),那么当它的GOMAXPROCS设置为1时,Appengine不是答案。
就您的具体代码而言,您没有提供任何我们可以查看并帮助调试您的竞争条件的内容。要自己这样做,您可以通过阅读此博文来了解和使用the Go Race Detector
答案 1 :(得分:0)
我不知道app引擎当前是否支持多个操作系统线程,但即使只有一个OS级别的线程可用,也绝对可以使用通道。您提供的链接指出“存在goroutines和channel”,它们只是在一个OS级别的线程中处理。