promise identity perl6

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í.