{
    "componentChunkName": "component---src-templates-blog-post-tsx",
    "path": "/phan-phoi-xu-ly-trong-nodejs-worker-threads/",
    "result": {"data":{"site":{"siteMetadata":{"title":"Chung Tran","author":"@chungtran4078"}},"markdownRemark":{"id":"ba909d14-745a-5923-ac47-b6ad608c5e74","excerpt":"Module worker_threads được thêm vào Nodejs kể từ v10.5, Worker thread có thể được sử dụng để giải quyết các vấn đề của child processes vì thread nhẹ và các…","html":"<p>Module worker_threads được thêm vào Nodejs kể từ v10.5, Worker thread có thể được sử dụng để giải quyết các vấn đề của child processes vì thread nhẹ và các worker thread chia sẻ bộ nhớ hay cũng có thể giao tiếp với nhau. <br/>\nChúng ta cứ hiểu là sự khác biệt giữa <strong>worker thread</strong> và <strong>child processes</strong> cũng giống như sự khác biệt giữa <strong>thread</strong> và <strong>process</strong> trong hệ thống máy tính vậy.\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/283834c0555b38103ed90d824c6f5994/df51d/image.jpg\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 53.37837837837838%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAEF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB3bQB/8QAFxAAAwEAAAAAAAAAAAAAAAAAAREgIv/aAAgBAQABBQJ6JU//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAVEAEBAAAAAAAAAAAAAAAAAAARIP/aAAgBAQAGPwIr/8QAGhAAAgIDAAAAAAAAAAAAAAAAAAERMRBBYf/aAAgBAQABPyGHSJFWFRseP//aAAwDAQACAAMAAAAQgM//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAdEAEAAgICAwAAAAAAAAAAAAABACERMRBBUWGR/9oACAEBAAE/EEDXLsv5AByvwLEITSTG3qAS+P/Z'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Worker threads trong Nodejs\"\n        title=\"Worker threads trong Nodejs\"\n        src=\"/static/283834c0555b38103ed90d824c6f5994/1c72d/image.jpg\"\n        srcset=\"/static/283834c0555b38103ed90d824c6f5994/a80bd/image.jpg 148w,\n/static/283834c0555b38103ed90d824c6f5994/1c91a/image.jpg 295w,\n/static/283834c0555b38103ed90d824c6f5994/1c72d/image.jpg 590w,\n/static/283834c0555b38103ed90d824c6f5994/a8a14/image.jpg 885w,\n/static/283834c0555b38103ed90d824c6f5994/fbd2c/image.jpg 1180w,\n/static/283834c0555b38103ed90d824c6f5994/df51d/image.jpg 2400w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span>\nQuay trở lại bài toán từ phần 1, chúng ta sẽ triển khai worker threads để giải quyết nó.</p>\n<p><strong>File: <code class=\"language-text\">server.js</code></strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> express <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"express\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token function\">express</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> Worker <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"worker_threads\"</span><span class=\"token punctuation\">)</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/greeting\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  res<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello world\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/get-fibonacci\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> startTime <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">runGetFibonacciWorker</span><span class=\"token punctuation\">(</span><span class=\"token function\">parseInt</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">.</span>query<span class=\"token punctuation\">.</span>number<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> endTime <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        number<span class=\"token operator\">:</span> <span class=\"token function\">parseInt</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">.</span>query<span class=\"token punctuation\">.</span>number<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        fibonacci<span class=\"token operator\">:</span> result<span class=\"token punctuation\">.</span>fibonacci<span class=\"token punctuation\">,</span>\n        time<span class=\"token operator\">:</span> endTime<span class=\"token punctuation\">.</span><span class=\"token function\">getTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> startTime<span class=\"token punctuation\">.</span><span class=\"token function\">getTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"ms\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">runGetFibonacciWorker</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">number</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> worker <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Worker</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"./getFibonacciWorker.js\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> workerData<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> number <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    worker<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"message\"</span><span class=\"token punctuation\">,</span> resolve<span class=\"token punctuation\">)</span>\n    worker<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"error\"</span><span class=\"token punctuation\">,</span> reject<span class=\"token punctuation\">)</span>\n    worker<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"exit\"</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">code</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>code <span class=\"token operator\">!==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Worker stopped with exit code </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>code<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">listen</span><span class=\"token punctuation\">(</span><span class=\"token number\">3000</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"listening on port 3000\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<br/>\n<p><strong>File: <code class=\"language-text\">getFibonacciWorker.js</code></strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> workerData<span class=\"token punctuation\">,</span> parentPort <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"worker_threads\"</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>workerData<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// gửi lại kết quả cho parent</span>\nparentPort<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> fibonacci<span class=\"token operator\">:</span> result <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">-</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Chạy thử <code class=\"language-text\">http://localhost:3000/get-fibonacci?number=45</code> và <code class=\"language-text\">http://localhost:3000/greeting</code> thì ta thấy kết quả như mong đợi.</p>\n<p>Ngoài ra có những bài toán ta có thể sử dụng nhiều worker để tăng tốc độ xử lý như xử lý hàng đợi, generate report… Mình sẽ làm 1 ví dụ đơn giản như sau:<br/>\nBài toán: Hãy tính tổng số chẵn từ 1 đến n, n là do người dùng gửi lên.</p>\n<p><strong>File: <code class=\"language-text\">server.js</code></strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> express <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"express\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token function\">express</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> Worker <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"worker_threads\"</span><span class=\"token punctuation\">)</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/greeting\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  res<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello world\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/sum-even-number\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> startTime <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">divisionOfWork</span><span class=\"token punctuation\">(</span><span class=\"token function\">parseInt</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">.</span>query<span class=\"token punctuation\">.</span>number<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">//parseInt is for converting string to number</span>\n    <span class=\"token keyword\">const</span> sumAll <span class=\"token operator\">=</span> result<span class=\"token punctuation\">.</span><span class=\"token function\">reduce</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">total<span class=\"token punctuation\">,</span> item</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      total <span class=\"token operator\">+=</span> item<span class=\"token punctuation\">.</span>sum\n      <span class=\"token keyword\">return</span> total\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> endTime <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        number<span class=\"token operator\">:</span> <span class=\"token function\">parseInt</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">.</span>query<span class=\"token punctuation\">.</span>number<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        sum<span class=\"token operator\">:</span> sumAll<span class=\"token punctuation\">,</span>\n        time<span class=\"token operator\">:</span> endTime<span class=\"token punctuation\">.</span><span class=\"token function\">getTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> startTime<span class=\"token punctuation\">.</span><span class=\"token function\">getTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"ms\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">runSumEvenNumberWorker</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> worker <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Worker</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"./sumEvenNumberWorker.js\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> workerData<span class=\"token operator\">:</span> data<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    worker<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"message\"</span><span class=\"token punctuation\">,</span> resolve<span class=\"token punctuation\">)</span>\n    worker<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"error\"</span><span class=\"token punctuation\">,</span> reject<span class=\"token punctuation\">)</span>\n    worker<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"exit\"</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">code</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>code <span class=\"token operator\">!==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Worker stopped with exit code </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>code<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">divisionOfWork</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">number</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Giả sử ta sẽ có tối đa 4 worker</span>\n  <span class=\"token comment\">// Giờ ta chia number thành các phần bằng nhau để giao cho worker xử lý</span>\n  <span class=\"token keyword\">const</span> oneOfPiece <span class=\"token operator\">=</span> <span class=\"token function\">parseInt</span><span class=\"token punctuation\">(</span>number <span class=\"token operator\">/</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">let</span> start <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n  <span class=\"token keyword\">const</span> workers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">while</span><span class=\"token punctuation\">(</span>start <span class=\"token operator\">&lt;</span> number<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>start <span class=\"token operator\">+</span> oneOfPiece <span class=\"token operator\">></span> number<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> worker <span class=\"token operator\">=</span> <span class=\"token function\">runSumEvenNumberWorker</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> start<span class=\"token punctuation\">,</span> end<span class=\"token operator\">:</span> number <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n      workers<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>worker<span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">const</span> worker <span class=\"token operator\">=</span> <span class=\"token function\">runSumEvenNumberWorker</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> start<span class=\"token punctuation\">,</span> end<span class=\"token operator\">:</span> start <span class=\"token operator\">+</span> oneOfPiece <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    workers<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>worker<span class=\"token punctuation\">)</span>\n    start <span class=\"token operator\">+=</span> oneOfPiece <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span>workers<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">listen</span><span class=\"token punctuation\">(</span><span class=\"token number\">3000</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"listening on port 3000\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><strong>File: <code class=\"language-text\">sumEvenNumberWorker.js</code></strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> workerData<span class=\"token punctuation\">,</span> parentPort <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"worker_threads\"</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> <span class=\"token function\">sumEvenNumber</span><span class=\"token punctuation\">(</span>workerData<span class=\"token punctuation\">.</span>start<span class=\"token punctuation\">,</span> workerData<span class=\"token punctuation\">.</span>end<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// gửi lại kết quả cho parent</span>\nparentPort<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> sum<span class=\"token operator\">:</span> result <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">sumEvenNumber</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">start<span class=\"token punctuation\">,</span> end</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> total <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n  <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> start<span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;=</span> end<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">%</span> <span class=\"token number\">2</span> <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">continue</span>\n    total <span class=\"token operator\">+=</span> i\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> total\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Với mã trên mình đã thực hiện so sánh tốc độ khi sum số chẵn của 0 - 9999999999 thì nếu xử lý single thread sẽ mất khoảng ~64012ms, trong khi chạy sử dụng 4 worker sẽ chỉ mất khoảng ~17209ms. Rõ ràng rồi, 4 ông làm thì phải lẹ hơn 1 ông chứ hehe.</p>\n<p><strong>Lưu ý:</strong> Đừng dùng dao giết trâu để mổ gà kẻo lại không biết khi nào có thịt gà mà ăn. Chẳng hạn bài toán sum số chẵn bên trên, nếu số bé quá thì ta sẽ thấy single thread chạy nhanh hơn nhiều với sử dụng worker vì nó không phải phân chia công việc và khởi tạo worker.<br/></p>\n<p>Hiểu đơn giản như sau:<br/>\nÔng chủ thầu muốn bốc 10 bao xi măng xuống xe, trong thời gian ổng đi kiếm 4 tay bốc vác thì thằng lái xe nó nhảy xuống bốc xong và đi về ăn cơm từ đời nào rồi.</p>\n<p><strong>Bài tiếp chúng ta sẽ tìm hiểu về Cluster và áp dụng cho bài toán trên xem nó có gì hay ho không nhé.</strong></p>","frontmatter":{"title":"Phân phối xử lý trong Nodejs P2: Worker threads","date":"2022-05-29","category":"Nodejs","tags":["nodejs","performance","optimization"],"image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/283834c0555b38103ed90d824c6f5994/ebb6e/image.jpg","srcSet":"/static/283834c0555b38103ed90d824c6f5994/ef064/image.jpg 158w,\n/static/283834c0555b38103ed90d824c6f5994/1127e/image.jpg 315w,\n/static/283834c0555b38103ed90d824c6f5994/ebb6e/image.jpg 630w,\n/static/283834c0555b38103ed90d824c6f5994/752ca/image.jpg 1260w","sizes":"(min-width: 630px) 630px, 100vw"},"sources":[{"srcSet":"/static/283834c0555b38103ed90d824c6f5994/a3156/image.webp 158w,\n/static/283834c0555b38103ed90d824c6f5994/99d05/image.webp 315w,\n/static/283834c0555b38103ed90d824c6f5994/0612e/image.webp 630w,\n/static/283834c0555b38103ed90d824c6f5994/8600c/image.webp 1260w","type":"image/webp","sizes":"(min-width: 630px) 630px, 100vw"}]},"width":630,"height":336}}}}}},"pageContext":{"slug":"/phan-phoi-xu-ly-trong-nodejs-worker-threads/","previous":{"fields":{"slug":"/phan-phoi-xu-ly-trong-nodejs-child-processes/"},"frontmatter":{"title":"Phân phối xử lý trong Nodejs P1: Child processes","category":"Nodejs","tags":["nodejs","performance","optimization"]}},"next":{"fields":{"slug":"/phan-phoi-xu-ly-trong-nodejs-cluster/"},"frontmatter":{"title":"Phân phối xử lý trong Nodejs P3: Cluster","category":"Nodejs","tags":["nodejs","performance","optimization"]}}}},
    "staticQueryHashes": ["3649515864","3894061898"]}