こういうときはどうやってやるのがいいのかなぁ
・なんか限れられた数のリソース(例えば、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を意識しながら動けてる