100%原生的JavaScript多线程和并行执行库:Hamsters.js
创始人
2025-03-17 11:20:27
0次

介绍

Hamsters是一个能让JavaScript代码并行执行的原生库,它可以让你面向高性能的JavaScript编程,它是一个开源项目,Github上标星4k+。它的目的就是让你更加容易的利用多线程的强大功能来并行编程实现性能的提升!

[[275039]]

Github

https://github.com/austinksmith/Hamsters.js

特性

  • 多功能,通过跨多个线程来最大限度地提高性能。

[[275040]] 

  • 自动数据聚合,自动将问题分解成较小的部分,并与单个输出并行执行。

[[275041]] 

  • 自动分类,按字母顺序或数字自动排序输出。

[[275042]] 

  • LEGACY 支持。

[[275043]] 

  • 备忘,计算一次后不再浪费 cpu 周期做同样的工作

[[275044]] 

  • 开放源代码,100%开源代码库,根据Artistic License 2.0发布

[[275045]] 

支持的环境

  • 所有主流浏览器、IE9 +

[[275046]] 

  • 现有 Web workers

[[275047]] 

  • Javascript shell 环境

100%原生的JavaScript多线程和并行执行库——Hamsters.js 

  • React Native

[[275048]] 

  • Node.js
[[275049]]

如何使用?

安装使用

  1. bower install WebHamsters 
  2. //OR 
  3. npm install hamsters.js 
  • 1、普通HTMl项目中使用 
  1.  
  2.   
  3.   
  4.   
  • 2、React Native
  1. import hamsters from 'path/to/hamsters'; 
  2.  import Worker from '...'; 
  3.  import hamsters from 'hamsters.js'; 
  4.  hamsters.init({ 
  5.  Worker: Worker 
  6.  }); 

  • 3、Nodejs
  1. var hamsters = require('hamsters.js'); 
  1. var Worker = require('...').Worker; 
  2.  var hamsters = require('hamsters.js'); 
  3.  hamsters.init({ 
  4.  Worker: Worker 
  5.  }); 
  • 4、入门使用

第一个要理解的是Hamsters.js是一个传递interfafce的消息,因此在使用库调用函数时,我们需要通过将params对象(消息)传递给库来指示库如何操作。

  1. var params = { 
  2.  bar: 'foo' 
  3.  }; 
  4.  hamsters.run(params, ....); 

我们将使用的下一个参数将是我们想要在一个线程或线程中执行的逻辑,我们之前传递的params对象将在我们的函数的上下文中可访问。现在应该能够看到如何确保可以在线程中访问变量和函数等不同的东西。

  1. hamsters.run(params, function() { 
  2. var foo = params.bar; 
  3. });  

第三个也是最后一个参数将是我们的onSuccess回调方法,此函数所需的唯一参数是输出。

  1. hamsters.run(params, function() { 
  2.  var foo = params.bar; 
  3.  }, function(results) { 
  4.  console.log(results); 
  5.  }); 

回到原始的params对象,为了从库中获得最佳性能和可靠性,需遵循一些约定。Hamsters.js的构建目标是并行而不是并发,尽管库很好地实现了并行执行的主要目标。由于这样做的各种设计决策是为了帮助实现这一目标,其中一个决定是库如何在线程之间分割数据以便执行,因此您希望在多个线程中访问的任何数组必须在您的参数内具有数组索引宾语。

  1. var params = { 
  2.  array: [1, 2, 3, 4]; 
  3.  }; 
  4.  hamsters.run(params, function() { 
  5.  for(var i = 0; i < params.array; i++) { 
  6.  rtn.data.push(params.array[i] * 4); 
  7.  } 
  8.  }, function(results) { 
  9.  }); 

使用此约定,通过简单地更改params对象中的一个选项,可以非常简单地并行化上述方法。现在使用下面的方法,4个线程将完成相同的任务,每个线程仅在数组的一个数字上运行。

  1. var params = { 
  2.  array: [1, 2, 3, 4]; 
  3.  threads: 4 
  4.  }; 
  5.  hamsters.run(params, function() { 
  6.  for(var i = 0; i < params.array; i++) { 
  7.  rtn.data.push(params.array[i] * 4); 
  8.  } 
  9.  }, function(results) { 
  10.  }); 

更进一步,库使用一个名为rtn的内部返回对象,这个rtn对象对于库具有一致的方式来处理线程输出是至关重要的。因此,当我们想要从线程返回一个值时,我们需要将结果推送到rtn.data数组中。或者你可以让你的rtn.data输出,但只有当你的输出已经是一个数组。

  1. hamsters.run(params, function() { 
  2.  rtn.data.push(params.bar); 
  3.  }, function(results) { 
  4.  console.log(results); // 'foo'; 
  5.  }); 

通过以上代码来看下它传递的参数:

  1. var params = { 
  2.  threads: Integer, 
  3.  aggregate: Boolean, 
  4.  dataType: String, 
  5.  memoize: Boolean 
  6.  sort: String, 
  7.  }; 

1、threads这个可选参数将告诉库执行先前声明的函数的线程数,这允许在非常简单的级别上更改您执行的线程数。如果您在此处未提供值,则库默认值为1。

2、aggregate此可选参数将告诉库我们是否要在执行后将各个线程输出聚合在一起,这仅在您跨多个线程执行并且默认为相关时才相关false。

3、dataType此可选参数将通知库我们的数据数组是JavaScript的类型化数组之一,在使用此参数时,库将自动格式化输出以匹配指定的输出dataType。

4、memoize此可选参数旨在与memoization模式结合使用,当启用memoization模式时,此参数允许用户控制单个函数级别是否缓存该函数的结果,其默认值为false。

5、sort此可选参数将告诉库按字母顺序或数字顺序自动对最终输出进行排序,此参数的默认值为,null并且可以使用排序选项进行配置。

params对象中包含的任何其他内容都可以在线程的执行上下文或多个线程中访问,具体取决于您使用库的方式。

除了以上基本使用方式,你可以查看官方的相关文档,有详细的介绍和使用方式,如Promise、排序、memoization、可转移对象、persistence、线程池、限制、设备等

总结

多线程和并行编程在Javascript中本身不是一件容易的事情,但是可借助第三方原生库来弥补它,能让你更加方便的进行多线程的编程,笔者可能并未介绍的非常清楚,如果你有这方面的需求,可以去查案Hamsters.js的相关文档来体验这种编程,希望对你有所帮助!

[[275050]]

 

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
只需三步,让你掌握阿尔法路由器... 请参照以下阿尔法路由器设置方法,通过浏览器进入及设置宽带路由器。经过这三个步骤的设置,基本上能够熟悉...
如何更省钱? 近期特价热门硒鼓... 如今激光打印设备已经成为商务或企业的绝对主力办公设备,但采购者往往忽视了激光打印设备所用的耗材,相对...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...