1. 首页
  2. IT资讯

Node和Worker Threads中并行性背后的基本概念

“u003Cpu003E在本文中,我们讨论最新版本的Node.js(13.0)中Node和Worker Threads中并行性背后的基本概念。u003Cu002Fpu003Eu003Ch1 class=”pgc-h-arrow-right”u003E并发与并行u003Cu002Fh1u003Eu003Cpu003E长期以来,Node.js在并发方面表现出色。在最近发布的Node 13.0中,Node现在对并行性也有了稳定的答案。 u003Cu002Fpu003Eu003Cpu003E并发可以看作是异步过程之间的切换,所有异步过程都轮流执行,并且在空闲时将控制权返回到事件循环。另一方面,并​​行性是进程分离并同时在多个线程上运行的能力。JavaScript中还有其他解决方案试图解决此问题。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F0e6734c2e1934c9598241b681f05cf66″ img_width=”871″ img_height=”567″ alt=”Node和Worker Threads中并行性背后的基本概念” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Ch1 class=”pgc-h-arrow-right”u003E主脚本u003Cu002Fh1u003Eu003Cpu003E主脚本必须做三件事u003Cu002Fpu003Eu003Cul class=””u003Eu003Cliu003E通过引用工作程序的js文件来创建工作程序。u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpreu003Eu003Ccodeu003E const worker = new WorkerThread.Worker(join(__dirname, '.u002Fworker.js'))u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cul class=””u003Eu003Cliu003E向工人发送消息以启动工作。消息只是一个JavaScript对象,因此,如果您需要自定义工作程序的行为,则可以包括任何分类,数据等。u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpreu003Eu003Ccodeu003E worker.postMessage({foo:"stuff"});u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cul class=””u003Eu003Cliu003E注册对动作的响应。工作者的任何响应都将是消息事件,并返回一个对象。您可以返回字符串或更复杂的对象,并带有工作人员已执行的任何操作的结果。u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpreu003Eu003Ccodeu003Eworker.on('message', (message) =>{ u002Fu002F对响应进行处理}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E现在,尝试将它们组合成脚本u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Econst { join } = require('path');const WorkerThread = require('worker_threads');const THREAD_COUNT = 30;u002F ** *运行修改THREAD_COUNT之前 * u002F(async () => { u002Fu002F设置运行作业所需的任何数据。 const users = await getAllUsers(); u002Fu002F定义函数以处理工作人员传递的不同消息 function handleStatusReport(workerNumber, report) { console.log(`the worker:${workerNumber} says`, report.body || report); } function handleWorkerFinished(worker, workerNumber, message) { console.log(`done with ${JSON.stringify(message.body)}!`); if (i < users.length) { worker.postMessage(users[i]); i += 1; } else { console.log(`Worker number ${workerNumber} completed working!`); } } u002Fu002F提升第一批工作人员……再利用这些工人,让他们完成更多的工作 for (let j = 0; j < Math.min(THREAD_COUNT, users.length); j += 1) { const worker = new WorkerThread.Worker(join(__dirname, '.u002Fworker.js')); console.log(`Running ${i} of ${users.length}`); worker.postMessage(users[i]); i += 1; u002Fu002F听工作者的消息 worker.on('message', (messageBody) => { u002Fu002F打开消息正文中的值,以支持不同类型的消息 if (messageBody.type === 'done') { handleWorkerFinished(worker, j, messageBody); } else { handleStatusReport(j, messageBody); } }); }})();u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Ch1 class=”pgc-h-arrow-right”u003E工作者脚本u003Cu002Fh1u003Eu003Cpu003E可以简单到 u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003EparentPort.on('message', async someObject => u002Fu002F一些使用对象的函数,可以通过返回给父工作器报告);u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E原本不需要报告;但这是个好习惯,它可以知道工作人员是否完成,失败或有选择地返回计算结果。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E parentPort.postMessage({ type: 'done', body: {key: 'value'} });u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpreu003Eu003Ccodeu003E parentPort.postMessage({ type: 'log', body: {message: 'something happened'} });u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E上面的示例具有一个type值为 done和 的属性 log。名称和值都是任意的-请记住,可以通过这种方式在工人和主人之间交换数据。另外,我应该注意,从工作程序向主服务器发送消息不会终止工作程序。因此,一个工人可以在执行期间发送许多消息。u003Cu002Fpu003Eu003Cpu003E这是针对工人的更全面的模板:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Econst { parentPort } = require('worker_threads');async function process(someObject) { u002Fu002F在这里做很多处理… u002Fu002F将状态更新发送给PRIMARY parentPort.postMessage({ type: 'status', body: 'still working' }); u002Fu002F进行更多处理… u002Fu002F将带有相关数据的最终消息发送回PRIMARY脚本 parentPort.postMessage({ type: 'done', body: {key: 'value'} });}u002Fu002F注册方法以对消息执行parentPort.on('message', asyncu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Ch1 class=”pgc-h-arrow-right”u003E补充说明u003Cu002Fh1u003Eu003Cpu003E线程工作器直到最近才成为Node 13.0中的稳定功能。如果在运行旧版本的节点时发生任何错误,则值得通过使用–experimental-worker标志运行来启用线程工作器。 u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Enode –experimental-worker master.jsu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E希望能对你有用。u003Cu002Fpu003E”

原文始发于:Node和Worker Threads中并行性背后的基本概念

主题测试文章,只做测试使用。发布者:程序员,转转请注明出处:http://www.cxybcw.com/26686.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code