promise - perl6 cómo obtener una identidad específica de promesas?
identity (2)
Estoy intentando codificar 3 servidores de eco que se ejecutan en promesas, pero quiero saber qué promesa está haciendo eco. ¿Hay una manera de hacer eso?
no strict;
for 0 .. 2 -> $index {
@result[$index] = start {
$myID = $index;
say "======> $myID/n";
my $rsSocket = IO::Socket::INET.new:
localhost => ''localhost'',
localport => 1234 + $index,
listen => 1;
while $rsSocket.accept -> $rsConnection {
say "Promise $myID accepted connection";
while $rsConnection.recv -> $stuff {
say "promise $myID Echoing $stuff";
$rsConnection.print($stuff);
}
$rsConnection.close;
}
}
}
await @result;
Los servidores de eco funcionan bien; probado con "nc";
El problema es $myID
convierte en 2
después de que se crean las promesas, y no hay forma de que yo diga qué promesa está haciendo el eco actual. Parece que $myID
es utilizado por todas las promesas; ¿Hay alguna manera de crear variables que sean específicas de una promesa individual?
Esa es una de las cosas que "pierdes" yendo no strict
.
Lo que necesitas es un alcance léxico. Usar my
le dará una variable diferente cada vez que se ingrese el bloque ( { ... }
).
Si haces esto:
for 0 .. 2 -> $index {
@result[$index] = start {
my $myID = $index;
Entonces $myID
será local al bloque de start
, y cada vez que se llame a ese bloque, recordará su id. Entonces obtendrá la identificación correcta cada vez que el socket reciba datos.
Realmente no necesita tener $myID
en absoluto. Solo puede usar $index
en la promesa porque ya se ha asignado al bloque loop. Aquí hay una modificación de trabajo (..with strict on):
my @result = do for 0 .. 2 -> $index {
start {
say "======> $index/n";
my $rsSocket = IO::Socket::INET.new:
localhost => ''localhost'',
localport => 1234 + $index,
listen => 1;
while $rsSocket.accept -> $rsConnection {
say "Promise $index accepted connection";
while $rsConnection.recv -> $stuff {
say "promise $index Echoing $stuff";
$rsConnection.print($stuff);
}
$rsConnection.close;
}
}
}
await @result;
Con eso cuidado siento la necesidad de señalar que no strict
usar no strict
parece muy innecesario. No solo te deja abierto a problemas de alcance tan extraños como estos, sino que básicamente no obtienes nada al hacerlo en tu ejemplo.
Volver a habilitar estrictamente su código no modificado y corregir los dos errores de compilación muestra solo ha guardado un total de cuatro pulsaciones de teclas, a expensas de las teclas que haya utilizado para escribir su pregunta aquí.