学习 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.go make worker ./worker example/client.go make client ./client
在例程中,我专门提供了 python 的 libgearman 的 wrapper 版本的例子实现,就现在来看,python 版本联合 golang 版本可以很好的工作。
现在这个包仅仅是可以运行的阶段,我即没有对代码做任何优化,也没有对代码进行任何覆盖性测试。同时,性能和稳定性全部都是未知。
要在项目里用的话,请确保你知道自己在干什么。
关于这个包的任何反馈都是欢迎的。在我的博客这里,或者 https://bitbucket.org/mikespook/gearman-go/issues。
哦,对了,在我真正在项目里使用这个包之前,它的 API 都是不稳定的,随时可能会发生改变。在可能的情况下,我或许会提供 gofix 支持,毕竟还没玩过这个有趣的东西。
有疑问加站长微信联系(非本文作者)