maaash.jp

what I create

[perl]TheSchwartzのWorkerにIDをつける

こういうときはどうやってやるのがいいのかなぁ
・なんか限れられた数のリソース(例えば、DISPLAYとか?、)があって、リソースにはTheSchwartzのWorkerを1対1対応させて、Workerを動かしたい
・Jobをinsertする方はどのWorkerに仕事させるか意識したくない

Jobをinsertする方はこんな
feeder.pl

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env perl  
use strict;
use warnings;
use FindBin;
use File::Spec;
use YAML::Syck;
use TheSchwartz;

my $conf = LoadFile( File::Spec->catfile($FindBin::Bin, ‘..’, ‘myapp.yml’) );  
my $pool = TheSchwartz->new( %{ $conf->{TheSchwartz}{args} } );
$pool->insert(‘MyApp::SleepWorker’);  
1;

0~9秒間の間でランダムな秒数寝るだけのWorkerを起動させるpl。
こいつを複数プロセス動かして、それぞれは自分に割り当てられてるリソースを知っている、っていう状態をつくりたい。
workの引数になんか入れてもだめっぽいので、、

worker.pl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env perl  
use strict;
use warnings;

use FindBin;
use File::Spec;
use lib File::Spec->catfile( $FindBin::Bin, ‘..’, ‘lib’ );  
use YAML::Syck;
use TheSchwartz;
use MyApp::SleepWorker;

my $conf = LoadFile( File::Spec->catfile($FindBin::Bin, ‘..’, ‘myapp.yml’) );  
my $worker = TheSchwartz->new( %{ $conf->{TheSchwartz}{args} } );
$worker->can_do(‘MyApp::SleepWorker’);  
$worker->work;

1;

環境変数なのかなぁ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package MyApp::SleepWorker;
use strict;
use warnings;
use base qw/TheSchwartz::Worker/;

sub work {
my ( $class, $job ) = @_;
my ($data) = $job->arg;

my $worker\_id = $ENV{WORKER\_ID};
print “[$worker_id]worker start\n”;

my $sleep_time = int(rand(10));
print “[$worker\_id]sleep: $sleep\_time\n”;  
sleep( $sleep_time );

print “[$worker_id]end\n”;  
$job->completed;
}

1;

boot_worker1, boot_worker2

1
2
3
4
5
6
7
#!/bin/sh  
export WORKER_ID=1
./worker.pl&

#!/bin/sh  
export WORKER_ID=2
./worker.pl&  

“` % ./boot_worker1; ./boot_worker2
% ./feeder.pl; ./feeder.pl;./feeder.pl; ./feeder.pl;./feeder.pl; ./feeder.pl;./feeder.pl; ./feeder.pl;
[2]worker start
[2]sleep: 8
[1]worker start
[1]sleep: 4
[1]end
[1]worker start
[1]sleep: 9
[2]end
[2]worker start
[2]sleep: 5
[2]end
[1]end
[2]worker start
[2]sleep: 9
[1]worker start
[1]sleep: 8
[1]end
[1]worker start
[1]sleep: 8
[2]end
[2]worker start
[2]sleep: 2
[2]end
[1]end[/code]

自分のIDを意識しながら動けてる

Comments