Sinkronisasi / Pemrograman Asinkron
Jika penelepon mengirim pesan ke penerima dan sedang menunggu tanggapan, dapatkah ia melakukan hal lain? Saya mengatakan penelepon/penerima bukan server/klien, karena panggilan ini terjadi di mana-mana. Secara desain, saat kami pertama kali membuat komputasi, semuanya sinkron. Ini dapat dilihat sebagai gelombang sinus di mana penelepon dan server sinkron atau ritme yang sama. Asynchronous berarti mereka tidak sinkron.
Sinkron I/O
Penelepon mengirimkan permintaan ke penerima dan kemudian memblokirnya. Ini adalah saat penelepon diblokir, tidak melakukan apa-apa, dan karenanya membuang-buang waktu. Di masa lalu, CPU menghapus proses dari prosesor, mengira itu baru saja diblokir, dan menambahkan proses baru yang tidak diblokir (Context switching). Jadi penelepon tidak dapat mengeksekusi sementara itu. Terakhir, saat penerima merespons, sistem Operasi dapat mengembalikan proses ke prosesor. Karenanya penelepon membuka blokir. Ini menunjukkan bagaimana klien dan server sepenuhnya sinkron.
Contoh I/O Sinkron OS:
1. Program meminta CPU untuk membaca file dari disk.
2. Utas utama program diambil dari CPU.
3. Baca selesai, dan program mulai dijalankan kembali.
// A simple Js example
// Program starts
// Programs uses CPU to execute work.
SampleFunction();
// Program reads from the disk
// Program can't do anything until file loads
readfile("SyncExample.dat")
// Program resumes
Berbicara secara khusus dari titik NodeJs, ia menggunakan epoll di Linux, dan dalam kasus windows, ia menggunakan tumpukan pelengkap. Hal lain yang dilakukan nodeJ adalah memutar utas baru yang memblokir jika ada sesuatu yang perlu dilakukan operasi pemblokiran. Secara default, Nodejs memiliki 4 utas pekerja di perpustakaan libuv , yang digunakannya untuk operasi I/O, tetapi dapat dikonfigurasi.
Contoh panggilan asinkron OS (NodeJS)
a) Program memutar utas sekunder
b) utas Sekunder membaca dari disk. Jelas, OS menghapus dari prosesor saat ini
c) program Utama masih berjalan dan dijalankan.
d) Thread selesai dan memanggil thread utama.
// A simple Javascript example
// Program starts
// Programs uses CPU to execute work.
SampleFunction();
// Program reads from the disk
// Program hapilly moves on to the samplefunction2
readfile("SyncExample.dat", onReadFinish(console.log))
//file is not probably read yet
SampleFunction2();
//onReadFinish function called
// executing it
Sekarang kita akan membahas hal-hal murni dari persepsi klien dan server (backend).
Jadi sinkronisitas juga dapat dikenal sebagai properti klien di mana ia dapat menunggu atau melanjutkan. Saat ini, tidak ada klien yang sinkron, dan sebagian besar perpustakaan bersifat asinkron. Sebagian besar klien mengirim permintaan, dan mendapat respons, dan beberapa panggilan balik dipanggil setiap kali respons dijalankan. Jadi di Node.js secara khusus, ada loop utama event loop yang memeriksa respons.
Ini bisa membingungkan, seperti yang selalu saya alami ketika seseorang menjelaskannya dengan contoh kehidupan nyata yang indah ini yang sinkron seperti mengajukan pertanyaan dalam rapat di mana rapat akan berlanjut jika presenter merespons. Asinkron seperti mengajukan pertanyaan dalam email yang dapat ditanggapi setiap kali penerima mendapat waktu.
Pemrosesan backend asinkron
Menjadi insinyur backend, tidak adil jika saya tidak berbicara tentang membuat backend asinkron. Dalam banyak kode/repositori, klien pada dasarnya asinkron, tetapi backend masih membuatnya menunggu. Jadi ketika klien meminta untuk mendorong beberapa data, katakanlah untuk melakukan panggilan basis data, berkali-kali diminta untuk menunggu respons dari backend, yang mengembalikan respons status 200 setelah komit. Sekarang, jika kita memindahkan lensa ke backend, frontend tidak sinkron, tetapi backend tetap sinkron. Jadi bagaimana kita mengembalikan tanggapan segera?
Salah satu solusinya adalah dengan menggunakan struktur data yang indah ini, bernama antrian. Jika klien mengirimkan permintaan, kami tidak akan berjanji untuk segera mengeksekusinya, tetapi kami akan memasukkannya ke dalam antrean. Alasannya adalah karena backend mungkin menyelesaikan permintaan sebelumnya, dan klien tidak diblokir lagi; kami dapat mengirim tanggapan bahwa kami telah mengantri permintaan, dan ini adalah janji/JobID. Untuk informasi lebih lanjut, Anda dapat membaca tentang antrean pesan .
Ada solusi yang sangat populer selain ini, tergantung pada kasus penggunaan.
Contoh dunia nyata dari beban kerja Asynchronous:
a) Asynchronous melakukan di Postgres ↗ .
b) I/O asinkron di Linux (io-uring).
c) Asynchronous I/O fsync (fs-cache): Setiap kali kita menulis sesuatu ke file apa pun, itu tidak langsung ditulis ke disk tetapi ke cache sistem file. Ada cache di sistem Operasi, dan tulisan masuk ke halaman. Dan kemudian, sistem operasi menghapus semua halaman sekaligus.
Kita dapat meringkas semuanya sebagai berikut:
a) Pendekatan pemrograman sinkron mengeksekusi tugas secara berurutan. Setiap tugas dilakukan setelah menunggu tugas sebelumnya selesai.
b) Ketika tugas dijalankan dalam model pemrograman asinkron, kita dapat beralih ke yang lain tanpa menunggu yang sebelumnya selesai.
Terima kasih sudah membaca; Saya harap ini membantu.
Jika ada keraguan lebih lanjut, jangan ragu untuk terhubung melalui LinkedIn / Instagram .

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































