3

我知道

perl6 -e '@r = do for ^500 {start { .say; sleep 3 }}; await @r'

在我的系统上创建了大约十几个moar线程并将它们用作 Promise 池,但我想像在 Go 中一样一次启动它们。那可能吗?

4

1 回答 1

5

据我了解,goroutines 是一个非常低级的结构。
Perl 中的大多数东西都不是非常低级的。

最接近您认为您想要的可能是直接使用Threads

my @r = do for ^100 { # currently aborts if it's much over 100
  Thread.start: { .say; sleep 3 };
}

# The implementation may actually create several threads
# for this construct
@r>>.finish;

我强烈建议您不要这样做,因为它不是非常可组合的。


如果您想在等待 3 秒后打印出数字,我会使用 Promise 的方法.in,该方法返回一个Promise ,该 Promise将保留那么多秒。 此示例似乎几乎同时创建了 500 个线程,但实际上可能不会启动任何其他线程。

my @r = (^500).map: {
  Promise.in(3).then: -> $ { .say }
}
await @r;

Perl 6 也有SuppliesChannels

# get three events fired each second
my $supply = Supply.interval: 1/3;

react {
  # not guaranteed to run in order.
  whenever $supply.grep(* %% 3) { print 'Fizz' }
  whenever $supply.grep(* %% 5) { print 'Buzz' }

  whenever $supply {
    sleep 1/10; # fudge the timing a little
    .put
  }

  whenever Promise.in(10) {
    say 'ten seconds have elapsed';
    done
  }
}

一般来说,异步构造的设计是为了隐藏一些你必须用线程处理的毛茸茸的事情。

事实上,使用线程最简单的方法之一可能就是在or方法调用之前添加hyperor :racemapgrep

my @r = (^50).hyper( :batch(5), :degree(10) ).map: { .say; sleep 1 }
# use `race` instead of `hyper` if you don't
# care about the order of @r
于 2015-08-11T01:51:19.117 回答