gpt4 book ai didi

concurrency - React 在处理 channel 时使用单线程

转载 作者:行者123 更新时间:2023-12-04 17:30:34 27 4
gpt4 key购买 nike

我的目的是让不同的线程同时从单个 channel 读取,并异步处理事物。我认为这可以解决问题:

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;
}

(这挂断是因为我没有关闭 channel ,但请不要看那个)。无论我做什么,这都会输出:
In thread 4
→ 6995966328
In thread 4
→ 12323793510
In thread 4
→ 5473561506

所以它总是使用单个线程并按顺序处理事物,而不是并行处理。有没有办法做到这一点?即使我 start whenever 中的线程块,结果将完全相同......

最佳答案

react/whenever构造旨在一次完整地处理一条消息。关键是状态保持在 react 内由于这一点,块是安全的。

可以让多个工作人员从 Channel 中读取信息;他们只需要如下设置:

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

react方法,当与 use v6.d.PREVIEW 一起使用时, 的好处是,当工作较少时,实际上根本不会占用 4 个线程,它们可以继续进行其他池化工作。如果整个应用程序只是处理来自 Channel 的内容仅此而已,您只需通过以下方式即可获得更少的开销和更好的位置:
my @sums;
for ^4 {
push @sums, start for $KXGA.list -> $number {
say "In thread ", $*THREAD.id;
say "→ ", (^$number).sum;
}
}

react 不同在这种方法中没有机会对不同的数据源使用react(原因 Channelreact 一起工作主要是为了您可以使用它们并同时处理异步数据源,或者一次处理多个 channel )。但如果你不需要,那么 for way 在代码中稍微简单一点,并且几乎肯定更快(并且,与 react 一样,循环竞争 Channel 中的项目,并在关闭时优雅地终止)。

关于concurrency - React 在处理 channel 时使用单线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49577943/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com