Web2.0 時代のジョブキューサーバーと呼ばれて久しい TheSchwartz ですが、今更ながら必要に駆られて弄っています。どんなものかの正しい解説については tokuhirom が記事を書いているので気になる方はそちらをご覧ください→web2.0 時代のジョブキューサーバー Gearman と TheSchwartz の関係について - TokuLog 改め だまってコードを書けよハゲ。
ちなみに、俺は、性行為を例えに使ったサンプルを作ってみて、その挙動を確認して学んでいるところ、というのが今回のお題です。なので俺の拙い知識での理解なのであんま信用しないでください。あくまでネタということで。では説明に入ります。
まず、ジョブキューとは、というのを簡単に理解したのですが、まあ、その名の通り、ジョブはお仕事です。 しかし、時間がかかるお仕事の場合など、それにある制限を設けたいときなどがあります。 大変なお仕事が一気に来られたらそれを処理する仕事人さんが困ってしまったりするからです。 だから
「お仕事は同時に(例えば)一個しかさばけねーんだよ」
そして
「いちいちそのお仕事終わるのまってられねーから、順番が着たらやっといて」
って感じにしたいのです。
これをより性行為というものを通して具体的に想像していきます。 とある人気の娼婦がいました。性行為という仕事をする仕事人さんです。 そして、彼女と性行為をしたいオッサンがたくさんいます。彼らが突然大勢で「やらせろよ」と押しかけると、娼婦は大変です。もちろん穴は一つ(ここではあえて一つにします)しかないので、同時に性行為をすることができるのは一人のチンコとだけです。そこで、娼婦は「私とやりたいのならチンコを並べて置いといて、順番に処理するから」と言います。ということでオッサンたちは前の人との性行為が終わるのを待つことなく、ちんこだけ置いて去ればいいのです。あとは順番がきたら娼婦がかってにちんこと性行為をしてくれます。 もちろん、娼婦が暇なときはすぐにちんこと穴との性行為が始まるようになっています。 こうして、娼婦さんはたくさんのオッサンのちんこを順番に(キューとして)処理し、オッサンたちは自分以外のオッサンをあまり気にせず娼婦を妊娠させることができるわけです。
サンプルコードの総称は「sexschwartz」にしました。 仕事をする worker の 娼婦は一人でいいのですが、問題はたくさんのオッサンというところで、そのオッサンたちをどこで手に入れようかと思ったのですが、そこはいいのがありました。外国の俳優さんたちです。 makidaisuke さん products の Acme::Actors::JA (Acme-Actors-JA作った - D-6 [相変わらず根無し])を使ってリストをYAML形式にして、オッサンである client が読み込み、ランダムで自分は誰であるかを決定するという仕組みです。そして、自分のチンコの名前を 娼婦であるworkerに伝えるということにしました。
ということで以下サンプルコードと動いているところです。
娼婦、sexschwartz_worker.pl。
#!/usr/bin/perl package Worker; use strict; use warnings; use FindBin; use lib "$FindBin::Bin/lib"; use base qw(TheSchwartz::Worker); use IO::File; use utf8; use Encode; sub work { my ( $class, $job ) = @_; my $chinko = $job->arg->{chinko}; print encode("utf-8","$chinko 気持ちいい\n"); sleep(3); # 妊娠期間3秒 my $text = "$chinko で妊娠して子供できちゃいました><"; utf8::encode($text); my $io = IO::File->new(); $io->open( 'log.txt', 'a' ) or die $!; $io->print("$text\n"); $io->close; $job->completed(); } package main; use strict; use warnings; use TheSchwartz; my $client = TheSchwartz->new( databases => [ { dsn => 'dbi:mysql:theschwartz', user => 'root', pass => '' } ], ); $client->can_do("Worker"); $client->work();
オッサン、sexschwartz_client.pl。
#!/usr/bin/perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/lib"; use TheSchwartz; use YAML; use utf8; use Encode; my $actors_yaml = YAML::LoadFile("actors.yaml"); my @actors = @$actors_yaml; my $who = $actors[rand($#actors)]; my $name = $who->{name}; utf8::decode($name); my $client = TheSchwartz->new( databases => [ { dsn => 'dbi:mysql:theschwartz', user => 'root', pass => '' } ], ); $client->insert( "Worker" => { chinko => "$name のチンコ" } ); my @list = $client->list_jobs( { funcname => "Worker" } ); print $#list + 1 . encode("utf-8","人の男優がセックス待ちです\n");
オッサンのチンコ
$ perl sexschwartz_client.pl 1人の男優がセックス待ちです $ perl sexschwartz_client.pl 2人の男優がセックス待ちです
娼婦の反応
$ perl sexschwartz_worker.pl ベルナール・ブリエ のチンコ 気持ちいい マイケル・J・フォックス のチンコ 気持ちいい
結果(log.txt)
ベルナール・ブリエ のチンコ で妊娠して子供できちゃいました>< マイケル・J・フォックス のチンコ で妊娠して子供できちゃいました><
補足で、もちろん 穴 の方を増やすこともできると思います。 俺の理解が足りないところがあったらがんがん突っ込んでください。あと、job を全てこなしきれていない worker のプロセスを殺すと、次回起動したときに job の数がずれるっていう問題があるっぽいんだけど、それはやはり job が全て終わるのを待つとか、立ち上げるときに db をクリアするとかすればいいのかなー。 ま、以上、娼婦とオッサンによる性行為で TheSchwartz を学んでみました。
- ガブリエル・ガルシア=マルケス 木村 榮一
- 単行本 / 新潮社 (2006/09/28)
- Amazon 売り上げランキング: 38149
- Amazon おすすめ度の平均:
- 貪欲な下半身
- 小説を読む歓びに溢れた傑作。
- すべては過去に