Perl 6 简单的并行

Perl 6 简单的并行

以下内容摘取于:Perl Introduction第14节
http://perl6intro.com/#_parallelism_concurrency_and_asynchrony

数据的并行计算

什么是数据的并行呢?就是有一个大的数据列表,每一个数据都用相同的处理方式,普通的方式我们会一个一个的处理。
那么并行就是可以分为部分,同时进行处理。
下面有一个很简单的例子
判断1到500000是不是质数

my @array = (0..500000);                     
my @result = @array.map({ is-prime $_ });
say now - INIT now;   

上面的代码运行时间为:95.1329786

如果用并行的方式运行呢?

my @array = (0..500000);                     
my @result = @array.race.map({ is-prime $_ });
say now - INIT now;   

然后只听到电脑狂响,然后用时37.98698062,节省了接近一分钟,效果还是有的。

这时有一个问题,因为数据的并行是把数据拆成几个部分,分别计算,所有计算的顺序不是按照数据的顺序来的。
但是有时候我们希望我们得到的最后结果还是按照原始的数据顺序,没有问题,Perl 6 还提供了一种下面一种方式

my @array = (0..500000);                     
my @result = @array.hyper.map({ is-prime $_ });
say now - INIT now;   

时间比上面慢了一秒钟。

可以试试下面的代码,看看输出的顺序。

#race
my @array = (1..1000);
my @result = @array.race.map( {$_ + 1} );
@result>>.say;
#hyper
my @array = (1..1000);
my @result = @array.hyper.map( {$_ + 1} );
@result>>.say;

多任务的并行

my @array1 = (0..49999);
my @array2 = (2..50001);

my @result1 = @array1.map( {is-prime($_ + 1)} );
my @result2 = @array2.map( {is-prime($_ - 1)} );

say @result1 == @result2;

say now - INIT now;

上面的程序主要干了这么一件事情:
1、有两个不同的数组,
2、对第一个数组,先把每个元素加一,然后判断是否是质数。
接着,对第二个数组,先把每个元素减一,然后判断是否是质数。
3、然后判断两个结果是否一样

上面程序运行一共用了17秒。

上面分别判断是否是质数的过程,是有先后顺序的,如何让两个任务同时进行呢?也非常简单。

my @array1 = (0..49999);
my @array2 = (2..50001);

my $promise1 = start @array1.map( {$_ + 1} );
my $promise2 = start @array2.map( {$_ - 1} );

my @result1 = await $promise1;
my @result2 = await $promise2;

say @result1 == @result2;

say now - INIT now;

竟然只用了0.57秒,是出了什么问题呢?不知道,差距也太大了吧。

上面程序首先用start方法启动了代码(?),然后,返回了一个Promise的类型或者说是一个简短的Promise(我也不知道是什么意思)
如果代码运行正常,那么Promise会被保留下去。
如果代码出错了,那么Promise会中断。

然后await在苦苦等待上面的Promise,如果上面的Poomise运行的很顺利,那么await 会等正确的返回值。如果出错了,那么会得到异常值。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值