Domanda

Non riesco a capire un modo per utilizzare le variabili del pacchetto (o qualsiasi cosa del genere) nelle app ballerini quando viene eseguito con Starman.Suppongo che sia in qualche modo correlato al prefotking di Starman ma dovrebbe essere una caratteristica, non un bug.

Ecco l'app Dancer di esempio:

package nafig;
use Dancer;

my $a = 0;
$b = 0;
$nafig::c = 0;

any '/' => sub {
    warn join " ", $a++, $b++, $nafig::c++;
};

start;
.

Allora faccio 3 chiamate consecutive a quell'app.Innanzitutto, lo eseguo con il server di riferimento di Plock e tutto funziona come previsto:

$ plackup app.pl
HTTP::Server::PSGI: Accepting connections at http://0:5000/
0 0 0 at ... blah-blah-blah
1 1 1 at ... blah-blah-blah
2 2 2 at ... blah-blah-blah
.

Ma quando faccio la stessa cosa con Starman, ottengo il seguente.

$ plackup -s Starman app.pl
2013/11/17-23:33:35 Starman::Server (type Net::Server::PreFork) starting! pid(527)
Resolved [*]:5000 to [::]:5000, IPv6
Not including resolved host [0.0.0.0] IPv4 because it will be handled by [::] IPv6
Binding to TCP port 5000 on host :: with IPv6
Setting gid to "1000 1000 20 24 25 29 30 44 46 108 109 115 121 1000"
Starman: Accepting connections at http://*:5000/
0 0 0 at ... blah-blah-blah
0 0 0 at ... blah-blah-blah
0 0 0 at ... blah-blah-blah
.

Tuttavia, quando si aggiorna rapidamente la pagina, a volte i valori vengono incrementati come previsto.Immagino che Starman rimane nella stessa forcella in quei casi.

Sono sorpreso che questa domanda non è stata mai chiesta su Stackoverflow prima.Le variabili persistenti mi sembrano utili, come ballano le persone senza di loro?

Grazie in anticipo per qualsiasi aiuto.

È stato utile?

Soluzione

Avrai bisogno di un modulo come cache :: memcached che ti permette di archiviare lo statoSopra fili biforcuti.

Qualcosa come questo (non testato)

use strict;
use warnings;

package nafig; #this should start with a capital letter
use Dancer;
use Cache::Memcached;

my $cache =  new Cache::Memcached {
    'servers' => ['127.0.0.1:11211'],
    'compress_threshold' => 10_000,
};

$cache->set("var1", 0);

any '/' => sub {

    my $value = $cache->get("var1");

    warn join " ", $value++;

    $cache->set("var1", $value);
};

start;
.

Adattato da qui http://perl.postbit.com/how-to-use-memcached-with-perl.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top