是否有与 Perl6 中的 Go goroutines 等效的东西?
Is there an equivalent to Go goroutines in Perl6?
我可以看到
perl6 -e '@r = do for ^500 {start { .say; sleep 3 }}; await @r'
在我的系统上创建了大约一打 moar
线程并将它们用作承诺池,但我想像在 Go 中一样同时启动它们。这可能吗?
据我了解,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 which returns a Promise 的 .in
方法,该方法将保留那么多秒。
此示例似乎几乎同时创建了 500 个线程,但实际上可能不会启动任何其他线程。
my @r = (^500).map: {
Promise.in(3).then: -> $ { .say }
}
await @r;
Perl 6 也有 Supplies and Channels
# 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
}
}
一般来说,异步结构的设计是为了隐藏一些你必须用线程处理的更复杂的事情。
事实上,使用线程最简单的方法之一可能就是添加 hyper
or race
before a map
or grep
方法调用:
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
我可以看到
perl6 -e '@r = do for ^500 {start { .say; sleep 3 }}; await @r'
在我的系统上创建了大约一打 moar
线程并将它们用作承诺池,但我想像在 Go 中一样同时启动它们。这可能吗?
据我了解,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 which returns a Promise 的 .in
方法,该方法将保留那么多秒。
此示例似乎几乎同时创建了 500 个线程,但实际上可能不会启动任何其他线程。
my @r = (^500).map: {
Promise.in(3).then: -> $ { .say }
}
await @r;
Perl 6 也有 Supplies and Channels
# 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
}
}
一般来说,异步结构的设计是为了隐藏一些你必须用线程处理的更复杂的事情。
事实上,使用线程最简单的方法之一可能就是添加 hyper
or race
before a map
or grep
方法调用:
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