first try to create persistant worker using Gearman::Driver
authorDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 23 May 2011 16:50:12 +0000 (18:50 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 23 May 2011 16:50:12 +0000 (18:50 +0200)
persistant_worker.pl [new file with mode: 0755]

diff --git a/persistant_worker.pl b/persistant_worker.pl
new file mode 100755 (executable)
index 0000000..cefe70f
--- /dev/null
@@ -0,0 +1,64 @@
+#!/usr/bin/perl
+
+package Cog; # persistant Gearman Worker - see the pun?
+
+use Moose;
+use JSON::XS qw();
+extends 'Gearman::Driver::Worker::Base';
+
+sub prefix { '' }
+
+sub encode_json {
+       my ( $self, $result ) = @_;
+       return JSON::XS::encode_json($result);
+}
+
+sub decode_json {
+       my ( $self, $workload ) = @_;
+       return JSON::XS::decode_json($workload);
+}
+
+package main;
+
+use Gearman::Driver;
+
+my $driver = Gearman::Driver->new(
+       server   => 'localhost:4730',
+       interval => 60,
+       loglevel   => 'DEBUG',
+       logfile    => 'log/persistant.log',
+) || die $!;
+
+my $w1 = 'Cog';
+my $worker = $w1->new();
+
+$worker->meta->add_method( 'scale_image' => sub {
+       my ( $self, $job, $workload ) = @_;
+       warn "# scale_image $job $workload";
+       # do something
+       return { scale_image => $workload };
+});
+
+
+# run each method in an own process
+foreach my $method (qw(scale_image )) {
+       $driver->add_job(
+               {
+                       max_processes => 5,
+                       min_processes => 1,
+                       name            => $method,
+                       worker          => $worker,
+                       methods    => [
+                               {
+                                       body   => $w1->meta->find_method_by_name($method)->body,
+#                                      decode => 'decode_json',
+                                       encode => 'encode_json',
+                                       name   => $method,
+                               },
+                       ]
+               }
+       );
+}
+
+$driver->run;
+