加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

并发性 – React在处理通道时使用单个线程

发布时间:2020-12-15 05:05:29 所属栏目:百科 来源:网络整理
导读:我的目的是让不同的线程同时从单个通道读取,并异步处理.我认为这样可以解决问题: my Channel $KXGA .= new;for ^100 { $KXGA.send( (100000..200000).pick );}my $sums = start react whenever $KXGA - $number { say "In thread ",$*THREAD.id; say "→ ",
我的目的是让不同的线程同时从单个通道读取,并异步处理.我认为这样可以解决问题:
my Channel $KXGA .= new;

for ^100 {
    $KXGA.send( (100000..200000).pick );
}

my $sums = start react whenever $KXGA -> $number {
    say "In thread ",$*THREAD.id;
    say "→ ",(^$number).sum;
}

(这是因为我没有关闭频道,但请不要看那个).无论我做什么,这都输出:

In thread 4
→ 6995966328
In thread 4
→ 12323793510
In thread 4
→ 5473561506

因此,它始终使用单个线程并按顺序处理事物,而不是并行处理.有没有办法做到这一点?即使我在每个块内启动线程,结果也会完全相同……

react /never构造旨在一次处理一个完整的消息.重点是反应块内的状态是安全的,这要归功于此.

可以让多个工作人员从频道阅读;他们只需要设置如下:

my @sums;
for ^4 {
    push @sums,start react whenever $KXGA -> $number {
        say "In thread ",$*THREAD.id;
        say "→ ",(^$number).sum;
    }
}

当与v6.d.PREVIEW一起使用时,这种反应方法的优点是,当工作量较少时,它实际上根本不会占用4个线程,并且它们可以继续进行其他池化工作.相反,如果整个应用程序只是处理来自频道的东西,那就是全部,你只需要更少的开销和更好的局部性:

my @sums;
for ^4 {
    push @sums,start for $KXGA.list -> $number {
        say "In thread ",(^$number).sum;
    }
}

与反应不同,这种方法没有机会对不同的数据源做出反应(Channels使用react主要是因为你可以使用它们同时使用异步数据源,或者可能同时处理多个通道).但是如果你不需要,那么for代码在代码中更简单,并且几乎肯定更快(并且,与反应一样,循环在Channel中的项目上竞争并在它关闭时优雅地终止).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读