読者です 読者をやめる 読者になる 読者になる

beanstalkdを試してみる

Python Gearman

beanstalkd is a fast, distributed, in-memory workqueue service.

http://xph.us/software/beanstalkd/

ということで、ちょっと試してみる。ダウンロードページより最新版の1.1をダウンロードしインストール。インストールされるのは、/usr/local/bin/beanstalkdだけなので、いたってシンプル。

$beanstalkd -h
Use: beanstalkd [OPTIONS]

Options:
 -d       detach
 -l ADDR  listen on address (default is 0.0.0.0)
 -p PORT  listen on port (default is 11300)
 -u USER  become user and group
 -z SIZE  set the maximum job size
 -h       show this help

フォアグラウンドで起動させるには、

$ beanstalkd -l 127.0.0.1 -p 11300

Pythonクライアントを使う

pybeanstalkを使う。他にもErlang, OCaml, PHP, Perl, Rubyのライブラリがあるようだ。

生産者側

接続先を指定してサーバオブジェクト(beanstalk.serverconn.ServerConn)を生成。消費者側に渡すデータと接続先を指定してジョブオブジェクト(beanstalk.job.Job)を生成し、実際にキューへ登録するにはQueue()をコールする。

from beanstalk import serverconn, job

conn = serverconn.ServerConn("127.0.01", 11300)
data = job.Job(data="Hello World", conn=conn)
data.Queue()

正直、

queue = serverconn.ServerConn("127.0.01", 11300)
queue.enqueue(job.Job(data="SPAM EGG HAM"))

のようなAPIにしない感覚が理解できん。

消費者側

消費者側も同じようにサーバオブジェクトを生成して、reserve()でキューのデータを待ち、処理を終了したならば、Finish()をコールする。

from beanstalk import serverconn, job

conn = serverconn.ServerConn("localhost", 11300)
conn.job = job.Job
while 1:
    j = conn.reserve()
    print j.data
    j.Finish()

Gearmanで同じことをやる

確かに動くのだが、Gearmanの方が洗練されているかな。

消費者側
from gearman import GearmanClient, Task

client = GearmanClient(["127.0.0.1"])
client.do_task(Task("greet", "World"))
生産者側
from gearman import GearmanWorker

def greet(job):
    print "Hello", job.arg

worker = GearmanWorker(["127.0.0.1"])
worker.register_function("greet", greet)
while 1:
    worker.work()