Parallel.js初探续集

时间:2022-03-26 08:46:59
@author mrbean
例子均来源于github parallel.js

  昨天写的第一篇今天一看居然有50+的阅读量了,感觉很激动啊,但是也有点害怕毕竟这只是自己笔记性质的一点东西,所以赶紧拿起来再看看。其实自己也没什么把握,所以希望大家看的话有什么不同的以及各种见解可以留个评论大家一起学习。

  今天主要是解释一下示例代码,个人觉得就粗浅的用法来说只要是能看懂这几个例子就差不多了

一、

 var p = new Parallel([1, 2, 3, 4, 5]);

 console.log(p.data); // prints [1, 2, 3, 4, 5]

这段代码就十分简单了,就是首先构造了一个新的parallel job然后使用.data输出其中的数据。个人另外测试了一下用string可以输出,用json貌似只是输出object

二、

 var p = new Parallel('forwards');

 // Spawn a remote job (we'll see more on how to use then later)
p.spawn(function (data) {
data = data.reverse(); console.log(data); // logs sdrawrof return data;
}).then(function (data) {
console.log(data) // logs sdrawrof
});

  这段代码功能很简单就是首先像上面一样进行了初始化,然后调用spanw函数产生一个新的线程,然后使用一个匿名函数将数据逆转,最后输出。但是这份代码在我的浏览器(chrome for windows)上不能运行,第5行报错,说是不存在那个函数。

  就然后就各种查,最后怀疑是可能他这个不支持这么用字符串(也可能是我的问题,希望有知道的或者自己运行成功的可以留言告诉我),于是加上一个split发现这样就可以了很是神奇。。。最后join一下就得到要的输出将结果了。

三、

 var p = new Parallel([0, 1, 2, 3, 4, 5, 6]),
log = function () { console.log(arguments); }; // One gotcha: anonymous functions cannot be serialzed
// If you want to do recursion, make sure the function
// is named appropriately
function fib(n) {
return n < 2 ? 1 : fib(n - 1) + fib(n - 2);
}; p.map(fib).then(log) // Logs the first 7 Fibonnaci numbers, woot!

  代码很简单,就是一个初始化然后定义一个求斐波那契的函数,最后调用map函数,这样就可以对其中每个数据执行fib,最后输出修改过的数据(这个由于有递归过程用require的话应该会有一定的提速作用)

四、

 var p = new Parallel([0, 1, 2, 3, 4, 5, 6, 7, 8]);

 function add(d) { return d[0] + d[1]; }
function factorial(n) { return n < 2 ? 1 : n * factorial(n - 1); }
function log() { console.log(arguments); } p.require(factorial) // Approximate e^10
p.map(function (n) { return Math.pow(10, n); }).reduce(add).then(log);

  这段代码首先初始化,然后定义了一个add函数,这个函数是后面用来进行归纳(这个翻译貌似不太通。。。)结果的。然后一个求阶乘的函数,由于是递归的所以用了require进行优化。最后我们看执行的函数,首先调用map,这样存的数就成了【1,10,100,1000,10000,100000,1000000,10000000,100000000】,然后调用reduce函数传入参数add就可以把所有值相加得到最后结果111111111

五、

 var p = new Parallel([1, 2, 3]);

 function dbl(n) { return n * 2; }

 p.map(dbl).map(dbl).map(dbl).then(function (data) {
console.log(data); // logs [8, 16, 24]
}); // Approximate e^10
p.map(function (n) { return Math.pow(10, n) / factorial(n); }).reduce(add).then(log);

不解释。。。成功输出一个,不成功输出后一个(不过这没定义失败函数)。

六、

 var p = new Parallel([1, 2, 3], { evalPath: 'https://raw.github.com/adambom/parallel.js/master/lib/eval.js' });

 function cubeRoot(n) { return Math.pow(n, 1 / 3); }

 // Require a function
p.require(cubeRoot); // Require a file
p.require('blargh.js'); p.map(function (d) {
return blargh(20 * cubeRoot(d));
});

require可以接受字符串或者函数或者地址类型的参数,注意使用文件名要包含eval.js

require我的初步理解就是把一个东西放在所有线程都能看得到的地方,这个主要应该是饮用一些重要的重复利用率较高的文件。