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
所以。如何使我的算法线程安全并获得一定程度的并行性。
首先想到的是使用似乎是线程安全的通道:
可以将Gos缓冲通道用作线程安全队列吗?
但是,然后我在顶部看到了一个链接,这表明可能无法使用频道。
所以..如果它们不可用,也许我需要为计算设置一个任务队列,一次只能执行一次计算。
有人可以启发我在Golang App Engine上实现一定程度的线程安全并行化的最佳模式吗?
谢谢。
Google Appengine目前仅允许一个操作系统线程。
了解操作系统线程的方式; Goroutine及其堆栈;和调度程序正常工作,我建议阅读可扩展Go调度程序建议或Go Runtime调度程序分析。
由于您可以在单个线程上使用多个通道和goroutine,因此Appengine可以很好地进行并发。如果您需要并行处理(即不仅要运行多个goroutine,还要在许多处理器上运行它们),那么Appengine暂时无法解决问题,因为其GOMAXPROCS设置为1。
就您的特定代码而言,您没有提供任何我们可以查看并帮助调试您的竞争条件的信息。为此,您可以阅读此博客文章,了解和使用Go Race Detector,从而从中受益。
我不知道App Engine当前是否支持多个操作系统线程,但是即使只有一个OS级线程可用,您也可以绝对使用通道。您提供的链接确实指出"存在goroutine和通道",它们全都在一个OS级线程中处理。