Multithreading Node.js

Cara Membuat Multithreading di Node.js

Penggunaan Multithreading sangat bermanfaat untuk operasi intensif CPU. Dengan membagi beban kerja menjadi beberapa thread, Anda dapat memanfaatkan sumber daya CPU tersedia secara efisien serta dapat mencapai performa yang lebih baik dibanding dengan menjalankan tugas secara berurutan.

Multithreading biasanya digunakan pada sisi server untuk menangani beberapa koneksi klien secara bersamaan.

Adapun setiap koneksi klien dapat diproses dalam thread terpisah, Sehingga penanganan permintaan secara bersamaan dan meningkatkan skalabilitas.

Perlu anda ketahui meskipun multithreading menawarkan berbagai manfaat, akan tetapi terdapat juga kelemahan yang terdapat pada multithreading seperti tantangan synchronization, data sharing, dan pengelolaan kode multithread yang cermat diperlukan untuk memastikan keamanan thread dan menghindari masalah terkait konkurensi.

Baik sekarang kita coba membuat perbandingan ketika menggunakan singlethreading dan multithreading.

Contoh Menggunakan Singlethreading

Kita buat file dengan nama index.js kemudian silahkan copy kode berikut ini.

const express = require("express");

const app = express();
const port = process.env.PORT || 3000;

app.get("/", (req, res) => {
  let counter = 0;
  for (let i = 0; i < 99_999_999_999; i++) {
    counter++;
  }

  res.status(200).send(`result is ${counter}`);
});

app.listen(port, () => {
  console.log(`App listening on port ${port}`);
});

Dari kode diatas kita mencoba melakukan looping yang banyak. Coba anda jalankan dengan perintah berikut.

node index.js

Silahkan buka browser dan lihat yang terjadi, prosesnya akan berjalan sangat lama karena terjadi looping yang sangat banyak. Sehingga memerlukan waktu untuk memprosesnya.

Begitulah ketika kita menggunakan singlethread yang memproses banyak data, Pasti akan mempengaruhi performa dari website.

Contoh Menggunakan Multithreading

Baik sekarang kita coba menerapkan multhreading pada looping yang banyak data seperti contoh diatas.

Kita buat file baru dengan nama index-workers.js kemudian silahkan copy kode berikut ini.

const express = require("express");
const { Worker } = require("worker_threads");

const app = express();
const port = process.env.PORT || 3000;
const THREAD_COUNT = 4;

function createWorker() {
  return new Promise((resolve, reject) => {
    const worker = new Worker("./workers.js", {
      workerData: { thread_count: THREAD_COUNT },
    });

    worker.on("message", (data) => {
      resolve(data);
    });

    worker.on("error", (error) => {
      reject(`Error occurred ${error}`);
    });
  });
}

app.get("/blocking", async (req, res) => {
  const workerPromises = [];

  for (let i = 0; i < THREAD_COUNT; i++) {
    workerPromises.push(createWorker());
  }

  const thread_results = await Promise.all(workerPromises);
  const total =
    thread_results[0] +
    thread_results[1] +
    thread_results[2] +
    thread_results[3];

  res.status(200).send(`result is ${total}`);
});

app.listen(port, () => {
  console.log(`App listening on port ${port}`);
});

Pada kode di atas terdapat variable THREAD_COUNT berisi jumlah thread yang ingin anda buat. Nanti ketika Anda memiliki lebih banyak cores di server anda, penskalaan akan melibatkan perubahan nilai THREAD_COUNT menjadi jumlah thread yang ingin anda gunakan.

Setelah itu kita buat fungsi createWorker dan mengembalikan promise. Dalam promise callback, Anda menginisialisasi thread baru dengan meneruskan jalur file ke kelas workers.js ke kelas Worker.

Sekarang kita buat file baru lagi dengan nama workers.js dan copy kode berikut ini,

const { workerData, parentPort } = require("worker_threads");

let counter = 0;
for (let i = 0; i < 99_999_999_999 / workerData.thread_count; i++) {
  counter++;
}

parentPort.postMessage(counter);

Sekarang kita jalankan dengan perintah berikut ini.

node index-workers.js

Dan buka browser anda kemudian dengan cepat dapat memproses data dengan banyak looping. Beginilah manfaat dari multithread yang dapat memproses banyak data dengan cara membagi beban kerja menjadi beberapa thread.

Kesimpulan

Pada artikel ini kita telah membahas mengenai Multithread pada Node.js dan kita juga telah membandingkan performa Multithread dan Singlethread dalam memproses banyak data.

Ada banyak manfaat yang bisa anda dapat ketika menerapkan multithread. Akan tetapi perlu anda ketahui bahwa penggunaan thread worker di Node.js mungkin akan menimbulkan kerumitan.

Seperti menangani status secara bersama dan sinkronisasi antar thread. Meskipun thread worker dapat memberikan manfaat dalam skenario tertentu, Anda juga harus menilai persyaratan aplikasi anda dengan cermat.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top