這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
學習 Go 已經有一段時間了,關於《學習Go語言》的翻譯進度一如既往的像之前一樣緩慢。每當翻譯到一處,看到 Go 語言那精妙的設計的時候,就會忍不住想寫點什麼。好吧,其實我之前的計劃是寫一個自己用的proxy,不過還是算了吧,原因大家都懂。輪子造太多,沒意思。
在整理一些之前的技術架構和思考新的架構的過程中,一次又一次提高了 Gearman 在系統中的重要性。雖然基於“新項目用老技術,老項目用新技術”的原則,並不打算在新的項目中使用 Golang。不過,總會有一天新項目要變成老項目吧?總會有一天,老項目需要做一些調整吧?理由牽強了點,但總是給自己找到了一個做的理由。
於是就有了這個:http://bitbucket.org/mikespook/gearman-go
最初構思的版本是對成熟的 libgearman 用 cgo 做一個 wrapper。失敗了……原因也很簡單,沒辦法將一個 golang 的 func 作為指標傳遞到 C 中去。
本想對 unsafe 的 Pointer 做一個 Hacking,看有沒有辦法得到一個 func 的指標,後來很2B的發現,需要通過在注釋裡寫 C 的方式來做 wrapper。難道提供一個需要在注釋裡寫代碼的 2B api 嗎?
糾結許久,於是用 golang 原生實現了一套 Gearman 的協議。感謝 Gearman,協議設計很簡單,文檔也還算清晰。更要感謝 Golang,代碼寫起來很開心,實現很給力。
– 安裝
cd ./src/pkg/gearman/make install
– 常式
# example/worker.gomake worker./workerexample/client.gomake client./client
在常式中,我專門提供了 python 的 libgearman 的 wrapper 版本的例子實現,就現在來看,python 版本聯合 golang 版本可以很好的工作。
現在這個包僅僅是可以啟動並執行階段,我即沒有對代碼做任何最佳化,也沒有對代碼進行任何覆蓋性測試。同時,效能和穩定性全部都是未知。
要在項目裡用的話,請確保你知道自己在幹什麼。
關於這個包的任何反饋都是歡迎的。在我的部落格這裡,或者 https://bitbucket.org/mikespook/gearman-go/issues。
哦,對了,在我真正在項目裡使用這個包之前,它的 API 都是不穩定的,隨時可能會發生改變。在可能的情況下,我或許會提供 gofix 支援,畢竟還沒玩過這個有趣的東西。