Globals и Threads в Mojolicious для обработки разных путей
В моем Perl-коде Mojolicious я выполняю задания, созданные и просматриваемые с удаленного клиента.
Я храню задания в массиве хешей, который является глобальной переменной.
Затем он используется в обработчиках PUT '/job/create' и GET '/job/status'. При добавлении нового задания с помощью PUT '/job/create' массив расширяется в подпрограмме (он содержит 4 элемента в приведенном ниже коде), но при запросе задания ' status via GET '/job/status'список заданий, массив не содержит добавленных элементов (он насчитывает 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 ответ
Решение
Это не сработает, поскольку Hypnotoad использует fork, а не потоки. Я предлагаю хранить данные в нечто вроде базы данных или http://p3rl.org/Cache::FastMmap.