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 上实现一定程度线程安全并行化的最佳模式吗?谢谢。
2 回答
慕哥9229398
TA贡献1877条经验 获得超6个赞
Google Appengine 目前只允许一个操作系统线程。
了解操作系统线程如何;Goroutines 及其堆栈;和调度器工作,我推荐阅读Scalable Go Scheduler 提案或Go Runtime Scheduler 分析。
由于您可以在单个线程上拥有多个通道和 goroutine,因此 Appengine 可以很好地处理concurrency。如果您需要并行性(即不仅运行多个 goroutine,而且在多个处理器上运行它们),那么 Appengine 目前不是答案,因为它的 GOMAXPROCS 设置为 1。
就您的特定代码而言,您没有提供任何我们可以查看并帮助调试您的竞争条件的代码。要自己这样做,您可以从阅读这篇关于并使用Go Race Detector 的博客文章中受益
BIG阳
TA贡献1859条经验 获得超6个赞
我不知道应用引擎当前是否支持多个操作系统线程,但是即使只有一个操作系统级线程可用,您也绝对可以使用通道。您提供的链接确实声明“存在 goroutine 和通道”,它们只是在一个操作系统级线程中处理。
- 2 回答
- 0 关注
- 222 浏览
添加回答
举报
0/150
提交
取消