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

Posted on 7月 26, 2008
Filed Under perl |

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

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

PERL:
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use FindBin;
  5. use File::Spec;
  6. use YAML::Syck;
  7. use TheSchwartz;
  8.  
  9. my $conf = LoadFile( File::Spec->catfile($FindBin::Bin, '..', 'myapp.yml') );
  10. my $pool = TheSchwartz->new( %{ $conf->{TheSchwartz}{args} } );
  11. $pool->insert('MyApp::SleepWorker');
  12. 1;

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

worker.pl

PERL:
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4.  
  5. use FindBin;
  6. use File::Spec;
  7. use lib File::Spec->catfile( $FindBin::Bin, '..', 'lib' );
  8. use YAML::Syck;
  9. use TheSchwartz;
  10. use MyApp::SleepWorker;
  11.  
  12. my $conf = LoadFile( File::Spec->catfile($FindBin::Bin, '..', 'myapp.yml') );
  13. my $worker = TheSchwartz->new( %{ $conf->{TheSchwartz}{args} } );
  14. $worker->can_do('MyApp::SleepWorker');
  15. $worker->work;
  16.  
  17. 1;

環境変数なのかなぁ

PERL:
  1. package MyApp::SleepWorker;
  2. use strict;
  3. use warnings;
  4. use base qw/TheSchwartz::Worker/;
  5.  
  6. sub work {
  7. my ( $class, $job ) = @_;
  8. my ($data) = $job->arg;
  9.  
  10. my $worker_id = $ENV{WORKER_ID};
  11. print "[$worker_id]worker start\n";
  12.  
  13. my $sleep_time = int(rand(10));
  14. print "[$worker_id]sleep: $sleep_time\n";
  15. sleep( $sleep_time );
  16.  
  17. print "[$worker_id]end\n";
  18. $job->completed;
  19. }
  20.  
  21. 1;

boot_worker1, boot_worker2

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

CODE:
  1. % ./boot_worker1; ./boot_worker2
  2. % ./feeder.pl; ./feeder.pl;./feeder.pl; ./feeder.pl;./feeder.pl; ./feeder.pl;./feeder.pl; ./feeder.pl;
  3. [2]worker start
  4. [2]sleep: 8
  5. [1]worker start
  6. [1]sleep: 4
  7. [1]end
  8. [1]worker start
  9. [1]sleep: 9
  10. [2]end
  11. [2]worker start
  12. [2]sleep: 5
  13. [2]end
  14. [1]end
  15. [2]worker start
  16. [2]sleep: 9
  17. [1]worker start
  18. [1]sleep: 8
  19. [1]end
  20. [1]worker start
  21. [1]sleep: 8
  22. [2]end
  23. [2]worker start
  24. [2]sleep: 2
  25. [2]end
  26. [1]end

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

Comments

Leave a Reply