2012-05-03 36 views
14

我想找到一個隊列結構(數據容器),其元素必須先進先出。對我來說結構必須是線程安全的對我來說很重要。我打算將這個數據容器用作任務或連接池。是否可以使用Go的緩衝通道作爲線程安全隊列?

我知道一個緩衝通道是線程安全的,但我不知道它是否能用作FIFO,特別是在併發情況下。

如果有可能使用緩衝通道作爲線程安全隊列,我是否需要擔心它的效率?

+1

渠道是答案。找到或寫出比渠道更好的東西的機會很小。 – Mostafa

+1

通道特別適用於任務隊列,資源共享,連接池等。注意不要重現基於線程的語言的模式,因爲Go語言的一大進步是goroutine + channel機制。一定要理解它(你可能可以提交一個架構或策略到SO)。 –

+1

這是我在Go瞭解到渠道時想到的第一件事,感謝您提出這個問題! – karysto

回答

2

我很確定渠道是FIFO。他們也便宜,所以他們會記憶效率。除此之外,不知道你將如何使用它們的細節我們無法給出更多的建議。

+0

謝謝。那麼,通道既是FIFO又是線程安全的?請給我一個鏈接或關於Channel機制實施細節的內容? – hardPass

+0

明確的文檔是:http://code.google.com/p/go/source/browse/src/pkg/runtime/chan.c查看chansend和chanrecv的實現細節。該規範沒有具體說明他們是一個fifo隊列,但它是可推導的,我想從如何使用它們的細節中思考。 –

+0

但是這是一個問題,我認爲如果使用golang通道的時間最多,安全性更低,標準和完整性比使用像RabbitMQ或ActiveMQ這樣的消息代理在最後同樣的努力。所以我不認爲這是一個補償性的問題 – deFreitas

11

在Go中,緩衝通道就是這樣:a 線程安全的FIFO隊列所以你要做的是完全有效的。這種方法根本不應該有性能問題。

0

一般來說,我會說緩衝通道不會產生一個好的併發安全隊列。創建它們爲整個緩衝區分配內存。如果您的隊列大小在執行期間從非常小到非常大,您必須分配最壞的情況並可能浪費大量內存。