Globals и Threads в Mojolicious для обработки разных путей - PullRequest
5 голосов
/ 23 февраля 2012

В моем Perl-коде Mojolicious я обрабатываю задания, созданные и просматриваемые с удаленного клиента.

Я храню задания в массиве хэшей, который является глобальной переменной.

Затем используется в обработчиках PUT '/ job / create' и GET '/ job / status'. При добавлении новой работы с помощью PUT '/ job / create' массив получает расширен в подпрограмме (она содержит 4 элемента в коде ниже), но при запросе рабочих мест «статус через GET» / работа / статус »список заданий, массив не содержит добавленных элементов (считается 2 элементы).

Спасибо, Ян

Вот код:

#!/usr/bin/perl -w

use threads; 
use threads::shared; 
use Mojolicious::Lite; 
use Mojo::JSON; 
my (%record, %job1, %job2, %job3, @jobs) : shared; 

%job1 = ( id=>"id1"); 
%job2 = ( id=>"id2"); 
%job3 = ( id=>"id3"); 

push ( @jobs, \%job1 ); 
push ( @jobs, \%job2 ); 

app->config(hypnotoad => {listen => ['http://*:3000']}); 

put '/job/create' => sub { 
    my $self = shift; 
    my $obj = Mojo::JSON->decode( $self->req->body ); 
    my $id = $obj->{id}; 
    %record = (id => $id); 
    push ( @jobs, \%record ); # test the global prefilled 
    push ( @jobs, \%job3 );   # test the global locally filled 
    $self->render(text => "Created job id $id. Jobs count: " . 
$#jobs ); 
}; 

get '/job/status' => sub { 
    my $self = shift; 
    my $out = "["; 
    for(my $i=0; $i<$#jobs+1; $i++) { 
        $out .= "{id:\""  . $jobs[$i]{id}      . "\","; 
        $out .= "," if $i<$#jobs; 
    } 
    $out .= "]"; 
    $self->render(text => "allJobsInfo($out). Num jobs: " . $#jobs); 
};

app->start();

1 Ответ

6 голосов
/ 23 февраля 2012

Это не сработает, поскольку hypnotoad использует fork, а не потоки.Я предлагаю хранить данные в чем-то вроде базы данных или Cache :: FastMmap .

...