perl6线程读取干扰
perl6 Thread reading interference
我需要有多个线程,每个线程都从同一个套接字或
$*输入;但是,似乎有错误,因为每个人都试图从同一来源读取(我认为)。解决此问题的最佳方法是什么?谢谢!!
my $x = start { prompt("I am X: Enter x: "); }
my $y = start { prompt("I am Y: Enter y: "); }
await $x, $y;
say $x;
say $y;
错误如下:
I am X: Enter x: I am Y: Enter y: Tried to get the result of a broken Promise
in block <unit> at zz.pl line 4
Original exception:
Tried to read() from an IO handle outside its originating thread
in block at zz.pl line 1
谢谢!!
在 Rakudo 的最新开发快照中,您的代码实际上可以正常工作,而不会在我的系统上抛出任何异常...
但是,它仍然会立即询问这两个值 (I am X: Enter x: I am Y: Enter y:
)。
要让第二个 prompt
等到第一个完成,您可以使用 Lock
:
#--- Main code ---
my $x = start { synchronized-prompt "I am X: Enter x: "; }
my $y = start { synchronized-prompt "I am Y: Enter y: "; }
await $x, $y;
say $x.result;
say $y.result;
#--- Helper routines ---
BEGIN my $prompt-lock = Lock.new;
sub synchronized-prompt ($message) {
$prompt-lock.protect: { prompt $message; }
}
棘手的部分是锁需要在线程开始并发使用它之前初始化。这就是为什么我在程序的主线中调用 synchronized-prompt
子例程的 Lock.new
outside 的原因。我没有在程序的顶部执行它,而是使用 BEGIN
phaser 以便我可以将它放在子例程旁边。
我需要有多个线程,每个线程都从同一个套接字或 $*输入;但是,似乎有错误,因为每个人都试图从同一来源读取(我认为)。解决此问题的最佳方法是什么?谢谢!!
my $x = start { prompt("I am X: Enter x: "); }
my $y = start { prompt("I am Y: Enter y: "); }
await $x, $y;
say $x;
say $y;
错误如下:
I am X: Enter x: I am Y: Enter y: Tried to get the result of a broken Promise
in block <unit> at zz.pl line 4
Original exception:
Tried to read() from an IO handle outside its originating thread
in block at zz.pl line 1
谢谢!!
在 Rakudo 的最新开发快照中,您的代码实际上可以正常工作,而不会在我的系统上抛出任何异常...
但是,它仍然会立即询问这两个值 (I am X: Enter x: I am Y: Enter y:
)。
要让第二个 prompt
等到第一个完成,您可以使用 Lock
:
#--- Main code ---
my $x = start { synchronized-prompt "I am X: Enter x: "; }
my $y = start { synchronized-prompt "I am Y: Enter y: "; }
await $x, $y;
say $x.result;
say $y.result;
#--- Helper routines ---
BEGIN my $prompt-lock = Lock.new;
sub synchronized-prompt ($message) {
$prompt-lock.protect: { prompt $message; }
}
棘手的部分是锁需要在线程开始并发使用它之前初始化。这就是为什么我在程序的主线中调用 synchronized-prompt
子例程的 Lock.new
outside 的原因。我没有在程序的顶部执行它,而是使用 BEGIN
phaser 以便我可以将它放在子例程旁边。