Di real case terkadang kita membutuhkan sebuah process yang berjalan secara berdampingan antara 1 process dengan process lainnya tanpa memblokir process utama atau terkadang kita juga ingin menjalankan sebuah process secara parallel atau process yang membutuhkan isolasi tinggi, permasalahan tersebut bisa kita solved dengan menggunakan module bawaan dari si nodejs yang itu worker_threads dan child_process.
-
workers_theads bisa dibilang secara umum module ini digunakan untuk menjalankan sebuah process secara
asynchronous (non blocking), biasanyaworkers_theadsdigunakan untuk menjalan sebuah process secaraparallelatau cocok juga untuk menjalankan task yang memilikiheavy processagar waktu eksekusi menjadi lebih cepat dan effisient.worker_threadsbiasa disebut juga sebuah module yang digunakan untuk menjalan multithreading. tapi perlu di ingat juga bukan berati ini tidak ada efek sampingnya jika anda tidak bisa menghandle nya dengan baik ini bisa terjadi yang namanyarace condition,race conditionsecara umum simplenya adalah sebuah kondisi yang dimana code tersebut belum selesai di eksekusi tetapi output sudah tercetak terlebih dahulu(balapan), contoh kehidupannya nyata anda sedang mengantri tiket konser, antriannya blm selesai tetapi anda sudah bisa masuk duluan atau yang di belakang anda bisa masuk terlebih dahulu. untuk menghandle terkait issuerace conditionini anda bisa menggunakan teknik yang namanyasemaphoreatamutexkalau di golangmutexmodule bawaan ada disyncpackage. dan perlu di ingat jugaworkers_theadslangsung menggunakan thread processor dari si os tersebut tidak seperti golang yang di gawangi oleh go runtime dan go schedule yang akan ngescheduling ke thread processor dari si os. perlu di ingat jugaworkers_theadstidak membuat process baru sepertichild_processbisa di bilang siworkers_theadsmemiliki memory address yang sama dengan main process jadi bisa saling sharing memory contoh darithread Akethread Bmenggunakanbroadcast channelataumessage channel, perlu di ingat jugaworkers_theadstidak supportInter Process Cominicatation (IPC)menggunakanprocess.sendsebagai gantinya anda bisa menggunakanparentPortsebagaiIPCdan untuk mengambil datanya anda bisa menggunakanworkerDataatauparentPort.on(<event name>). -
child_process bisa dibilang secara umum module ini digunakan untuk menjalankan sebuah process secara
asynchronous (non blocking)hampir mirip sepertiworker_threadscara kerjanya, tetapi module ini tidak cocok untuk menjalankan sebuah process secaraparallelatauheavy process. dikarenakan gak ada efek yang signifikan impact seperti mempercepat atau waktu eksekusi lebih effisient, tetapi ini sangat cocok untuk menjalankan sebuah process yang membutuhkan isolate tinggi, contoh konsep di real case seperti docker container memiliki process tersendiri yang dimana terisolate antar process 1 container dengan container lainnya, tetapi bedanya di docker antara 1 container dengan container lainnya bisa saling berkomunikasi satu sama lain jika anda menggunakan konseplinks,depends_ondanextra_hosts, sedangkan dichild_processtidak bisa komunikasi antara 1 process dengan process lainnya atau juga cocok jika anda ingin menjalan script sepertishell scriptatau bahasa pemerograman yang berbeda anda bisa menggunakanexecatauspawn.
-
Worker Threads
-
Strength
- Tidak membuat process baru dan masih dalam main process yang sama
- Menggunakan alamat memory yang sama sehingga bisa saling sharing data antar process
- Cocok digunakan untuk menjalankan tugas parallel dan heavy process, sehingga process eksekusi menjadi jauh lebih cepat
- Terjadinya overhead jauh lebih rendah ketimbang
child_processkarena tidak membuat process baru
-
Weakness
- Hanya bisa menjalan javascript/typescript code
- Pengunaan memory dan cpu meningkat seiring semakin banyak nya process tetapi masih jauh lebih baik ketimbang
child_process - Isolasi process kurang terisolate tidak seperti
child_processyang membuat process baru - Tidak support menggunakan
IPCsecara langsung, harus menggunakanparentPortuntuk menghandleIPC
-
-
Child Process
-
Strength
- Isolasi process sangat terisolate dikarenakan
child_processmembuat process baru - Bisa menjalankan selain javascript/typescript code anda bisa menggunakan
execatauspawn - Cocok digunakan untuk menjalankan tugas yang membutukan isolasi yang tinggi
- Pengunaan memory dan cpu jauh lebih rendah dari pada
worker_threadsjika process yang dijalankan jauh lebih sedikit - Bisa menjalankan konsep yang hampir sama dengan
worker_threadsanda bisa menggunakanfork - Support menggunakan
IPCsecara langsung tidak sepertiworker_threadsyang harus menggunakanparentPortuntuk menghandleIPC
- Isolasi process sangat terisolate dikarenakan
-
Weakness
- Tidak cocok yang menjalankan process parallel atau heavy process
- Terjadinya overhead jauh lebih tinggi ketimbang
worker_threadskarena membuat process baru - Pengunaan memory dan cpu meningkat seiring semakin banyak nya process
-
Penjelasan terkait worker_threads dan child_process, berdasarkan hasil explorisasi saya dan yang saya amati dari setiap process nya, jika anda masih penasaran dan haus informasi silahkan tinggal di explore saja, perlu di ingat ini beda dengan konsep cluster, kalau module cluster digunakan untuk menggunakan semua thread yang ada tetapi tidak menjalankan sebuah process secara asyncronus, dikarenakan by default nodejs itu single thread, tetapi anda bisa menggabungkan antara konsep cluster dan worker_threads atau child_process.