2014-09-05 90 views
0

http://blog.golang.org/go-and-google-app-engineGolang,App Engine的,渠道和線程安全

「此外,雖然夠程和渠道都存在,當轉到應用程序在App Engine上只運行一個線程在給定的情況下運行。也就是說,所有夠程在一個單一的操作系統線程中運行,所以可用於給定的客戶端請求沒有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

不知道是不是這樣,但即使使用GOMAXPROCS = 1,任何全局變量仍然可以被多個goroutine更新。如果你真的不需要全局變量來協調多個任務,那麼就不要再把它們變成全局的了 - 也許把它們移動到你按照請求分配的結構中。這個問題是一個非常籠統的描述,所以很難多說。 – twotwotwo 2014-09-05 18:23:59

回答

1

谷歌Appengine目前只允許一個操作系統線程。

瞭解操作系統線程; Goroutines和他們的堆棧;和調度程序的工作,我推薦閱讀the Scalable Go Scheduler proposalAnalysis of the Go Runtime Scheduler

既然你可以有多個通道,單個線程上的例程,Appengine將會很好地與併發。如果你需要並行性(即不僅運行多個goroutines,而且在多個處理器上運行它們),那麼當它的GOMAXPROCS被設置爲1時,Appengine並不是答案。

就您的特定代碼而言,您沒有提供任何我們可以查看的信息,並有助於調試您的競爭條件。如果你自己這樣做,你可以通過閱讀這篇博客文章,並使用the Go Race Detector

0

我不知道,如果應用程序引擎目前支持多個操作系統線程,但你完全可以使用渠道即使只有一個操作系統級線程可用。您提供的鏈接確實聲明「goroutines和渠道存在」,它們只是在一個OS級別的線程中處理。