2012-02-23 4 views
5

私のMojolicious perlコードでは、リモートクライアントから作成され、監視されたジョブを処理します。異なるパスを扱うためのMojoliciousのグローバルとスレッド

グローバル変数であるハッシュの配列にジョブを保存します。

PUT '/ job/create'とGET '/ job/status'のハンドラで使用されます。 PUT '/ job/create'で新しいジョブを追加するとき、配列は をサブルーチン(このコードには4つの要素が含まれています)の に拡張しますが、GET '/ job/status' ジョブのリストには、配列に追加された要素が含まれていません(2 要素)。

おかげで、月

はここのコードです:hypnotoadスレッド、フォークを使用していないよう

#!/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(); 

答えて

6

は、これは本当に、動作しません。データベースやCache::FastMmapのようなものにデータを格納することをお勧めします。

+0

ありがとうございました。最後に、私はCouchDBで解決策に移りました。かなり良いbtwに見えます。 :) –

+0

代わりの 'perl your.appデーモン-l 'http:// *:3000''も働くことができます。 [ビルトインWebサーバー](http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Built2Din_web_server) – klekker

関連する問題