当前位置: 首页 > 知识库问答 >
问题:

perl6线程读取干扰

斜光耀
2023-03-14

我需要从同一个套接字或者从$*IN中读取多个线程;然而,似乎有错误,因为每个都试图从相同的来源读取(我认为)。解决这个问题的最好方法是什么?谢谢!!

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

谢谢!!

共有1个答案

唐修能
2023-03-14

在Rakudo的最新开发快照中,您的代码实际上工作正常,没有在我的系统上抛出任何异常...< br >但是,它仍然立即要求两个值(< code > I is X:Enter X:I is Y:Enter Y:)。

要让第二个< code >提示符等待第一个提示符完成,您可以使用< code>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; }
}

棘手的部分是,在线程开始并发使用它之前,需要初始化锁。这就是为什么我在程序的主线中的同步提示子例程之外调用 Lock.new 的原因。我不是在程序的顶部执行此操作,而是使用 BEGIN 相位器,以便可以将其放在子例程旁边。

 类似资料:
  • 我试图在Perl6中逐行读取一个巨大的gz文件。 我正在尝试做这样的事情 但是这会给出一个错误,我有一个格式不正确的UTF-8。我看不到如何从帮助页面读取gzip材料https://docs.perl6.org/language/unicode#UTF8-C8或https://docs.perl6.org/language/io 我想完成和在Perl5中一样的事情:http://blog-en .

  • 我试图在Perl6中逐行读取gz文件,但是,我被阻止了: > 如何在Perl6中逐行读取gz文件,但是,这种方法将所有内容读入会使用太多的RAM,除了在非常小的文件上之外,它都不可用。 我不明白如何使用Perl6的逐行获取所有内容,尽管我在他们的github上打开了一个问题 https://github.com/retupmoca/P6-Compress-Zlib/issues/17 我正在尝试用

  • 问题内容: 我正在用Go编写执行大量并行计算的软件。我想从工作线程中收集数据,但我不太确定如何以安全的方式进行数据收集。我知道我可以使用通道,但是在我的场景中,它们使它变得更加复杂,因为我必须以某种方式同步主线程中的消息(等到每个线程发送了一些东西)。 情境 主线程创建 n个 实例,并在goroutine中启动其方法,以便每个工作线程都在各自的线程中运行。主线程每10秒应从工作线程中收集一些简单值

  • 有一天我在想线程,我开始怀疑如果多个线程根本不修改它,它们是否可以访问相同的信息(不使用同步(锁))。 一个例子是10个线程读取1个类,由于我们称之为M的线程,这些线程调用访问器从这个类中获取信息,但不以任何方式修改信息。 同时,线程M偶尔会修改这个类中的数据(这将改变10个线程在“重启”后正在进行的计算结果) 会有问题吗?问题是其中一个线程将线程M修改过的信息“放回”。最重要的是,是否有一天访问

  • 在我们的Java应用程序中,我需要从oracle数据库中读取8000万记录。我试图为此重新设计多线程程序。目前,我们使用Java5个线程池,10个线程基于主键模式并行读取数据库。每个线程将读取不同的模式,如001*和002*。 如何提高该计划的性能?我正在考虑设计模式,让引导线程读取数据库并将处理委托给子线程。在我们现有的设计中,不同的线程通过10个jdbc连接访问表。使用新方法,我将只有一个线程

  • 我总是从命令行运行程序,允许你混合参数的顺序。如果你在其中加入额外的东西,他们就会抓住你。例如: 他们是怎么做到的?有这方面的模块吗?