なので、大枠を例のままPythonを使って動かし、肝心の処理関数(通常はProcess_batch())だけをPerlで記述するためのTIPS。
#!/usr/bin/perl
use Data::Dumper;
use Sys::Syslog;
use Inline Python => <<'END_OF_PYTHON_CODE';
import sys, os, pgq, skytools
import syslog ,time
class zConsumer(pgq.Consumer):
def __init__(self, service_name, db_name):
self.procEvent = perl.procEvent;
pgq.Consumer.__init__(self, service_name, db_name, ["/tmp/var/mqueue/consumer.ini"])
def process_batch(self, src_db, batch_id, ev_list):
for ev in ev_list:
d = ev.data
self.log.debug ("event: %s | type: %s | extra1: %s" % (d, ev.type, ev.extra1))
if not self.procEvent(ev):
ev.tag_retry()
else:
ev.tag_done()
END_OF_PYTHON_CODE
my $objPgq = zConsumer->new("mqueue_consumer","src_db");
#print Dumper($objPgq);
$objPgq->start();
# イベント処理関数は、この関数を差し替えることでPerlで書けます
sub procEvent{
openlog(__FILE__, 'cons,pid', 'local4');
syslog('debug', 'this is Inline test');
closelog();
print Dumper(shift);
}
(Inline::Pythonのおかげで)上のプログラムでは各イベントを処理する部分だけ、procEvent()関数に切り出せていると思うので、これを書き換えればよい(=Perlで処理が書ける)です。
一部設定ファイルの指定は配列で渡さないとだめなのですが、Perlから渡すとなぜか上手くいかないので内部で宣言してしまっていますが、、、また調べます。
初めて使いますが、Inline::Pythonって便利ですね。これだあればアドオンモジュールをPythonで書かなくてはならない某商用アプリなんかも倒せそう。
0 件のコメント:
コメントを投稿