我正在尝试编写在promises中运行的3个echo服务器,但我想知道哪个承诺正在进行回显.有没有办法做到这一点?
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;
echo服务器运行正常;用“nc”测试;
问题是在创建承诺后$myID变为2,并且我无法告诉哪个承诺正在进行当前回显.似乎$myID被所有承诺使用;有没有办法创建特定于个人承诺的变量?
解决方法
你根本不需要一个$myID.您可以在promise中使用$index,因为它已经作用于循环块.这是一个工作修改(严格限制):
my @result = do for 0 .. 2 -> $index { start { say "======> $index\n"; my $RSSocket = IO::Socket::INET.new: localhost => 'localhost',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;
有了这种照顾,我觉得有必要指出使用不严格似乎是非常不必要的.它不仅让你对这些奇怪的范围问题持开放态度,而且在你的例子中你做的基本上没有任何好处.