рд╢реБрдн рджрд┐рди

рдореЗрд░реЗ рдХрд╛рдо рдкрд░, рдореЗрд░реЗ рдФрд░ рд╕рд╣рдпреЛрдЧреА рдХреЗ рдмреАрдЪ Node.JS рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд╛рдж рдЙрддреНрдкрдиреНрди рд╣реБрдЖ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реБрдИред рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЪреБрдирдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рд╖рдп рдЧрд░реНрдо рд╣реИ, рдХреГрдкрдпрд╛, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред
рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЦреБрджред рд╡реЗ Node.JS 10.5.0 рдореЗрдВ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рддрдХрдиреАрдХ рд╣реИрдВ, рдФрд░ "рдХрд╛рд░реНрдпрдХрд░реНрддрд╛_рдереНрд░реЗрдбреНрд╕" рдореЙрдбреНрдпреВрд▓ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ "--experimental-рдХрд╛рд░реНрдпрдХрд░реНрддрд╛" рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ Node.JS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдЭрдВрдбреЗ рдХреЛ рд╕реНрдЯрд╛рд░реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ package.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИ:
{ "name": "worker-test", "version": "1.0.0", "description": "", "main": "app.js", "scripts": { "start": "node --max-old-space-size=4096 --experimental-worker app.js " }, "author": "", "license": "ISC" }
рдЕрдм рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реАред рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдПрди рд╡рд░реНрдХрд░ рдереНрд░реЗрдбреНрд╕ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рд╡реЗ рд╕рднреА рдХреБрдЫ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЙрди рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬрд╣рд╛рдВ рдореБрдЦреНрдп рдФрд░ рдмрдЪреНрдЪреЗ рдХреА рдзрд╛рд░рд╛рдПрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ, рдореИрдВрдиреЗ рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реЗ рдЕрд▓рдЧ рдХрд░ рджрд┐рдпрд╛, рдпрд╣ рдореБрдЭреЗ рдЕрдзрд┐рдХ рд╕рд╛рдл рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИред
рджрд░рдЕрд╕рд▓, рдХреЛрдбред
рдореБрдЦреНрдп app.js рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд╣реИред
const { Worker } = require('worker_threads'); const path = require('path'); const WORKERS_NUMBER = 100; console.log('Hello from main!'); for (var i = 1; i <= WORKERS_NUMBER ; i++) { const w = new Worker(path.join(__dirname, './writer-worker-app/app.js'), { workerData: { id: i } }); }
рдпрд╣рд╛рдВ рд╣рдо рд╡рд░реНрдХрд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд╛рдЗрд▓реНрдб рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рд╕реНрдЯрд╛рд░реНрдЯ рдлрд╛рдЗрд▓ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ './writer-worker-app/app.js'ред рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдо рд╕реНрд╡рдпрдВ-рд▓рд┐рдЦрд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ ред/writer-worker-app/app.js:
const { workerData, parentPort } = require('worker_threads'); const logger = require('./logger'); const id = workerData.id; console.log(`Worker ${id} initializad.`); while (true) { sendMessage(); } function sendMessage() { logger.log(`Hello from worker number ${workerData.id}\r\n`); }
рдЦреИрд░, рд╕рдмрд╕реЗ рд╕рд░рд▓ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╡рд░реНрдЧ: ./writer-worker-app/logger.js
const fs = require('fs'); function log(message) { return fs.appendFileSync('./my-file.txt', message); } module.exports = { log };
рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╕рднреА рдХреЛ рдЙрдореНрдореАрдж рдереА рдХрд┐ рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рдорд┐рд▓реЗрдЧреА рдФрд░ рджрд╛рддрд╛ рдЪрд┐рд▓реНрд▓рд╛рдПрдВрдЧреЗ рдХрд┐ рдЕрд░реНрдз-рдХреЛрдиреЛрдВ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЕрдиреНрдп рдЦреБрд╢рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреИрд╕реЗ рд╣реИред рд▓реЗрдХрд┐рди рдирд╣реАрдВ! рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╕рднреА рд▓рд╛рдЗрдиреЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд░реБрдХрд╛рд╡рдЯ рдХреЗ рдЪрд▓рддреА рд╣реИрдВ, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдХреЛ рдЫреЛрдбрд╝рдХрд░:
Hello from worker number 14
Hello from worker number 3
Hello from worker number 9
Hello from worker number 15
Hello from worker number 2
Hello from worker number 4
Hello from worker number 7
Hello from worker number 6
Hello from worker number 1
Hello from worker number 11
рдПрдХ рдЕрджреНрднреБрдд рдкреНрд░рдпреЛрдЧ, рдиреЛрджрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЫреЛрдЯреА рдЬреАрдд :-) рдореЗрд░реА рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдиреЛрджрд╛ рдХреЗ I / O рд╕реНрддрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рдЬрд╛рдирдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ
fs.appendFileSync рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХреА рдЬрд╛рдБрдЪ рдХреА, рд▓реЗрдХрд┐рди
fs.createWriteStream рдФрд░
stream.write рд╡рд┐рдзрд┐ред
рдирддреАрдЬрд╛ рд╡рд╣реА рдирд┐рдХрд▓рд╛ред
рд▓реЗрдХрд┐рди рд╣рдо рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд░реБрдХреЗред
рдПрдХ рд╕рд╣рдХрд░реНрдореА рдиреЗ рдзрд╛рдЧреЗ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╕реБрдЭрд╛рдпрд╛ред рд╣рдорд╛рд░реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЖрд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░реЗрдВред рдкрд╣рд▓реЗ рдкрд╣рд▓реА рдзрд╛рд░рд╛ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдлрд┐рд░ рджреВрд╕рд░реА, рдлрд┐рд░ рддреАрд╕рд░реА рдФрд░ рдЗрд╕реА рддрд░рд╣ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рдкреНрд░рдмрдВрдзрдХ рдкреЗрд╢ рдХрд┐рдпрд╛ред рдореБрдЦреНрдп рдЪреАрдЬ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрди рдЕрд▓рдЧ-рдерд▓рдЧ рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдЪрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЦреБрд╢ рд╣реВрдВред рд╕реНрдЯреНрд░реАрдо-рдореИрдиреЗрдЬрд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЙрд╕рдХреЗ рдФрд░ рд▓реЗрдЦрдХреЛрдВ-рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдВрдЪрд╛рд░ рдЪреИрдирд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП
MessageChannel рдХреНрд▓рд╛рд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рджреЛ рдлрд╝реАрд▓реНрдб рд╣реИрдВ:
port1 рдФрд░
port2 , рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ
.on ( 'рд╕рдВрджреЗрд╢') рдФрд░
.postMessage () рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрджреЗрд╢ рд╕реБрди рдФрд░ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд░реНрдЧ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП "рдХрд╛рд░реНрдпрдХрд░реНрддрд╛_рдереНрд░реЗрдбреНрд╕" рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдЬрдм рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрд╕ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдирд┐рд╖реНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдпрд╣ рдмреЗрдХрд╛рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
2 рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рднреА рдХреЛ рдПрдХ рдкреЛрд░реНрдЯ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред
рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдереНрдп : 10.5.0 рдкрд░
рд╢реНрд░рдорд┐рдХ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреЛрд░реНрдЯ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ , рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛.рдкреЛрд╕реНрдЯрдореИрд╕реЗрдЬ () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлрд░рд▓рд┐рд╕реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкреЛрд░реНрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ!
рдереНрд░реЗрдб рдореИрдиреЗрдЬрд░ рд╕реНрд╡рдпрдВ рдЕрдкрдиреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЖрд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рд▓реЗрдЦрдХ рдХреЗ рдереНрд░реЗрдбреНрд╕ рдХреЛ рдХрдорд╛рдВрдб рднреЗрдЬреЗрдЧрд╛, рдФрд░ рдпрд╣ рд╕рдлрд▓ рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦрдХ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЕрдЧрд▓реА рдХрдорд╛рдВрдб рднреЗрдЬреЗрдЧрд╛ред
рдЕрдВрдбрд░-рдпреВрдПрдордПрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд░реЗрдЦ:

рд╣рдорд╛рд░реА рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдореБрдЦреНрдп ./app.js рдлрд╝рд╛рдЗрд▓:
const { Worker, MessageChannel } = require('worker_threads'); const path = require('path'); const WORKERS_NUMBER = 100; console.log('Main app initialized and started.'); const workersMeta = []; for (var i = 1; i <= WORKERS_NUMBER; i++) { const channel = new MessageChannel(); const worker = new Worker(path.join(__dirname, './writer-worker-app/app.js'), { workerData: { id: i } }); workersMeta.push({ id: i, worker, channel }); } workersMeta.forEach(({ worker, channel }) => { worker.postMessage({ orchestratorPort: channel.port1 }, [channel.port1]); }) setTimeout(() => { const orchestrator = new Worker(path.join(__dirname, './orchestrator-worker-app/app.js')); const orchestratorData = workersMeta.map((meta) => ({ id: meta.id, port: meta.channel.port2 })); orchestrator.postMessage({ workerPorts: orchestratorData }, orchestratorData.map(w => w.port)); console.log('All worker threads have been initialized'); }, WORKERS_NUMBER * 10);
рдпрд╣рд╛рдВ рд╣рдо рдкрд╣рд▓реЗ рд╢реНрд░рдорд┐рдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкреЛрд░реНрдЯ рдХреЛ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЛрд░реНрдЯ рднреЗрдЬрддреЗ рд╣реИрдВ (рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕ рддрд░рд╣ рд╕реЗ, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ)ред
рдлрд┐рд░ рд╣рдо рдПрдХ рдзрд╛рдЧрд╛ рдкреНрд░рдмрдВрдзрдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕реЗ рд▓реЗрдЦрдХ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рднреЗрдЬрддреЗ рд╣реИрдВред
рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ : рдЖрдиреБрднрд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЬрдм рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рдкреАрд╕рд╛ рдЬрд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ (рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рд╢реБрд░реВ рдХрд░реЗрдВ)ред рдЕрдЪреНрдЫреЗ рдХреЗ рд▓рд┐рдП "рдореИрдВ рддреИрдпрд╛рд░ рд╣реВрдВ!" рдХреА рд╢реИрд▓реА рдореЗрдВ рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдХреБрдЫ рдЬрд╡рд╛рдм рд╕реБрдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЖрд╕рд╛рди рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд┐рдпрд╛ред
рд╣рдо рд▓реЗрдЦрдХ рдереНрд░реЗрдб рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рднреА рдмрджрд▓ рджреЗрдВрдЧреЗ рддрд╛рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдмрддрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рднреА рджреЗрддрд╛ рд╣реИ рдЬрдм рд▓реЗрдЦрди рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:
./writer-worer-app/app.js
const { workerData, parentPort } = require('worker_threads'); const logger = require('./logger'); const id = workerData.id; console.log(`Worker ${id} initializad.`); parentPort.on('message', value => { const orchestratorPort = value.orchestratorPort; orchestratorPort.on('message', data => { if (data.command == 'write') { console.log(`Worker ${id} received write command`); sendMessage(); sendResult(orchestratorPort); } }); console.log(`Worker ${id} started.`); }); function sendMessage() { logger.log(`Hello from worker number ${workerData.id}\r\n`); } function sendResult(port) { port.postMessage({ id, status: 'completed' }); }
рд╣рдордиреЗ рдореВрд▓ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рдВрджреЗрд╢ рд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛, рд╕реНрдЯреНрд░реАрдо рдореИрдиреЗрдЬрд░ рдХрд╛ рдЪреИрдирд▓ рд╣реЛрдиреЗ рд▓рдЧрд╛, рдЬрдм рд╣рдо рдХрдорд╛рдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рдлрд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдкрд░рд┐рдгрд╛рдо рднреЗрдЬрддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП sendResult () рдХреЛ рддреБрд░рдВрдд SendMessage () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣рдорд╛рд░реЗ рд╕реНрдорд╛рд░реНрдЯ рдореИрдиреЗрдЬрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реИ
./orchestrator-worker-app/app.js:
const { parentPort } = require('worker_threads'); console.log('Orchestrator initialized.') let workerPorts; parentPort.on('message', (value) => { workerPorts = value.workerPorts; workerPorts.forEach(wp => wp.port.on('message', handleResponse)); console.log('Orchestrator started.'); sendCommand(workerPorts[0]); }); function handleResponse(status) { const responseWorkerId = status.id; let nextWorker = workerPorts.find(wp => wp.id == responseWorkerId + 1); if (!nextWorker) { nextWorker = workerPorts[0]; } sendCommand(nextWorker); } function sendCommand(worker) { worker.port.postMessage({ command: 'write' }); }
рд╣рдореЗрдВ рдкреЛрд░реНрдЯ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓реА рд╣реИ, рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкреЛрд░реНрдЯ рдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдФрд░ рдкрд╣рд▓реЗ рдХреЛ рдХрдорд╛рдВрдб рднреЗрдЬрд╛ рд╣реИред рдХреЙрд▓рдмреИрдХ рдореЗрдВ, рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦрдХ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдПрдХ рдХрдорд╛рдВрдб рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВред рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рддрдирд╛рд╡ рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреАрдореЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░рд╛рд▓ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдпрд╣реА рд╣реИ, рд╣рдорд╛рд░рд╛ рдмрд╣реБ-рд╕реВрддреНрд░рд┐рдд рдереНрд░реЗрдб-рдореИрдиреЗрдЬрдореЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдпрд╛рд░ рд╣реИред рд╣рдордиреЗ рди рдХреЗрд╡рд▓ Node.JS рдореЗрдВ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛-рдкреНрд░рд╡рд╛рд╣ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрд╛, рдмрд▓реНрдХрд┐ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреЗ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХреЗ рднреА рдмрдирд╛рдПред рдореЗрд░реА рдирд┐рдЬреА рд░рд╛рдп рдореЗрдВ, Node.JS рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдФрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде рдкреГрдердХ рдереНрд░реЗрдбреНрд╕ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдЖрд╢рд╛рдЬрдирдХ рд╣реИред рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред
рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред
рдЕрджреНрдпрддрди
рдкрд╛рдардХреЛрдВ рдХреЛ рдЧреБрдорд░рд╛рд╣ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдпрд╣ рднреА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореИрдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдзреЛрдЦрд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рд▓реЗрдЦ рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ред
рдкрд░рд┐рд╡рд░реНрддрди:
1) рдореВрд▓ рд▓реЗрдЦрдХреЛрдВ рдореЗрдВ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдм рдЬрдмрдХрд┐ (рд╕рдЪреНрдЪрд╛) рдХрдЯреНрдЯрд░ рдХреЗ рд╕рд╛рде рдЬрд╛рддрд╛ рд╣реИ
2) рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ - рдореЛрдо-рдкреБрд░рд╛рдиреЗ-рдЕрдВрддрд░рд┐рдХреНрд╖-рдЖрдХрд╛рд░ = 4096 рдЭрдВрдбрд╛, рд╕рд┐рд░реНрдл рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИред
3) рдереНрд░реЗрдб рдореИрдиреЗрдЬрд░ рд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдиреЙрди-рд╕реНрдЯреЙрдк рд╣реИред
4) рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВ - рдпрд╣ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИред
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
1) рдЪрд░ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝реЗрдВ рдпрд╛ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреА рдХреЙрд▓ рдХреА рдЧрд┐рдирддреА - рдзрдиреНрдпрд╡рд╛рдж FANAT1242
2) рдПрдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЬреЛрдбрд╝реЗрдВ, рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдХрд╛рдо рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 10 рд╕реЗрдХрдВрдб рдореЗрдВ рдХрд┐рддрдиреА рд▓рд╛рдЗрдиреЗрдВ рд▓рд┐рдЦреА рдЬрд╛рдПрдВрдЧреА)
рдЕрджреНрдпрддрди реи
1) рд▓реЙрдЧрд┐рдВрдЧ рдХреЛрдб рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдХреА рдПрдХ рдЕрд▓рдЧ рд▓рдВрдмрд╛рдИ рд╣реИред
2) рд▓реЗрдЦрдХ-рдХрд╛рд░реНрдпрдХрд░реНрддрд╛-рдРрдк / app.old.js рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рдЧрд╛ 1000 рдмрд╛рд░ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдлрд┐рд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ FANAT1242 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рднреА рд╕рдорд╛рди рд╕рдВрджреЗрд╢ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЗрдиреЗрдВ рдмрд┐рд▓реНрдХреБрд▓ 1000 * рдПрди рдереНрд░реЗрдб рд╣реИрдВред