¿Hay alguna manera de usar el paquete / variables globales con bailarina y starman?

StackOverflow https://stackoverflow.com//questions/20035318

  •  21-12-2019
  •  | 
  •  

Pregunta

No puedo averiguar una manera de usar variables de paquete (o nada del tipo) en las aplicaciones de bailarina cuando se ejecuta con Starman.Supongo que de alguna manera está relacionada con el prefaboración de Starman, pero eso se supone que es una característica, no un error.

Aquí está la aplicación de ejemplo Dancer:

package nafig;
use Dancer;

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

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

start;

Luego hago 3 llamadas consecutivas a esa aplicación.Primero, lo ejecuto con el servidor de referencia de Plack, y todo funciona como se esperaba:

$ 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

Pero cuando hago lo mismo con Starman, obtengo lo siguiente.

$ 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

Sin embargo, al actualizar la página rápidamente, a veces los valores se incrementan como se esperaba.Supongo que Starman permanece en el mismo tenedor en esos casos.

Me sorprende que esta pregunta nunca se haya pedido en StackOverflow antes.Las variables persistentes me parecen útiles, ¿cómo baila la gente sin ellos?

Gracias de antemano por cualquier ayuda.

¿Fue útil?

Solución

Necesitará un módulo como caché :: memcached que le permite almacenar el estadosobre hilos bifurcados.

algo así (no probado)

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;

Adaptado desde aquí http://perl.postbit.com/how---use-memcached-with-perl.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top