2015-05-06 36 views
3

剛開始使用Go並希望創建一個簡單的Web API。我正在研究使用Gorilla mux(http://www.gorillatoolkit.org/pkg/mux)來處理Web請求。瞭解web API的goroutines

我不確定如何最好地使用Go的併發選項來處理請求。我讀過main函數實際上是一個goroutine嗎?還是應該在收到它們時將每個請求發送到goroutine?道歉,如果我「走出去」。

+2

您並不需要Web服務的例程。這些庫本身已經能夠單獨處理請求。你只是擔心你的調用處理的效率有多高,而圖書館只處理剩下的問題。整個'網絡'機制大部分都已經做好了。這主要是爲什麼Go非常棒,提供開箱即用的真棒。 –

+0

謝謝 - 但我假設如果在處理程序中我需要從數據庫中獲取數據,那麼這可能/應該通過goroutine完成? – tommyd456

+0

沒有更好的mysql庫(或任何其他流行的)也可以通過相同的邏輯處理它們的調用。在使用像SQlite3這樣的庫時,您不需要像Objective-C/C/C++中習慣的那樣啓動高級隊列。再一次;只關注你的代碼的亮度。這些庫已經很棒了:D –

回答

7

假設你使用Go的http.ListenAndServe來爲你的http請求提供服務,每個傳入連接都由您單獨的goroutine處理。 http://golang.org/pkg/net/http/#Server.Serve 您通常會從main函數中調用ListenAndServe

大猩猩多路複用器僅僅是一個包,比http.DefaultServeMux更靈活的路由請求到您的處理程序。它實際上不處理傳入的連接或請求只是簡單地將它傳遞給您的處理程序。

我強烈建議你閱讀一下文檔,特別是本指南https://golang.org/doc/articles/wiki/#tmp_3關於編寫web應用程序。

1

即使我投票結果太寬泛,我仍在提供答案。

無論如何,沒有一件是真正必要的。你在想這件事。如果你還沒有讀過它,它看起來像一個體面的教程; http://thenewstack.io/make-a-restful-json-api-go/

您可以像設置最典型的rest框架一樣設置路由,並讓webserver/framework擔心請求處理級別的併發性。您只會使用goroutines來生成請求的響應,例如,如果您需要彙總來自文件夾中全部10個文件的數據。有爭議的例子,但這是你將每個文件分割一個goroutine的地方,通過讀取一個非阻塞選擇的通道來聚合所有的信息,然後返回結果。你可以期望所有的入口點都以異步的,非阻塞的方式被調用,如果這很有意義...

+1

正如Rob Pike反覆指出的那樣,你也需要感到厭倦,即使是非常便宜的東西,你也不應該過度使用它們並且看到它們的實際使用。說實話;當沒有真正做雙向任務時(如聊天或現場反饋系統),我從不使用goroutines。當休閒事物需要某種形式的負載分佈時,我更願意僅將它們作爲最後的手段(這可能還包括一些圖書館傾向於不最有效地使用cpu循環;讓它們以並列方式而不是串聯方式運行)。 –

+0

@Allendar我注意到這個博客文章,雖然這表明使用goroutines MongoDB(我可能會使用):http://blog.mongodb.org/post/80579086742/running-mongodb-queries-concurrently-with-go – tommyd456

+0

因爲NoSQL系統不像RDBMS那樣受到鎖的影響。快速瀏覽那篇文章,似乎他們使用例程來產生任務到數據庫,而無需等待直接確認。當你不關心結果時,這可能會很方便。我在做商店訂單時主要是這樣做的。告訴客戶你已經完成了,他們會在處理完所有信息後收到郵件。當例程得到支付提供商的確認時,它將郵寄給客戶。這對客戶來說非常流暢,因爲主流程不必等待。 –