Apakah panggilan asinkron selalu membuat utas baru? Apa perbedaan keduanya?
Apakah panggilan asinkron selalu membuat atau menggunakan utas baru?
Dalam pemrograman komputer, peristiwa asinkron adalah yang terjadi secara terpisah dari aliran program utama. Tindakan asinkron adalah tindakan yang dijalankan dalam skema non-pemblokiran, yang memungkinkan aliran program utama untuk melanjutkan pemrosesan.
Saya tahu panggilan async dapat dilakukan pada utas tunggal? Bagaimana ini mungkin?
multithreading
language-agnostic
asynchronous
Ted Smith
sumber
sumber
Jawaban:
Pertanyaan ini sangat umum untuk dijawab.
Dalam kasus umum, panggilan asinkron tidak harus membuat utas baru. Itu salah satu cara untuk mengimplementasikannya, dengan kumpulan thread yang sudah ada sebelumnya atau proses eksternal menjadi cara lain. Ini sangat tergantung pada bahasa, model objek (jika ada), dan menjalankan waktu lingkungan.
Asynchronous hanya berarti utas panggilan tidak duduk dan menunggu respons, juga aktivitas asinkron tidak terjadi pada utas panggilan.
Selain itu, Anda harus lebih spesifik.
sumber
Setiap kali operasi yang perlu dilakukan secara tidak sinkron tidak memerlukan CPU untuk melakukan pekerjaan, operasi itu dapat dilakukan tanpa memunculkan thread lain. Misalnya, jika operasi async adalah I / O, CPU tidak harus menunggu untuk I / O selesai. Itu hanya perlu memulai operasi, dan kemudian dapat beralih ke pekerjaan lain sementara perangkat keras I / O (pengontrol disk, antarmuka jaringan, dll.) Melakukan pekerjaan I / O. Perangkat keras memungkinkan CPU tahu kapan selesai dengan mengganggu CPU, dan OS kemudian mengirimkan acara ke aplikasi Anda.
Abstraksi dan API tingkat tinggi yang lebih sering tidak mengekspos API asinkron yang mendasarinya tersedia dari OS dan perangkat keras yang mendasarinya. Dalam kasus tersebut biasanya lebih mudah untuk membuat utas untuk melakukan operasi asinkron, bahkan jika utas yang ditumbuhkan hanya menunggu pada operasi I / O.
Jika operasi asinkron membutuhkan CPU untuk melakukan pekerjaan, maka umumnya operasi itu harus terjadi di utas lain agar benar-benar tidak sinkron. Bahkan kemudian, itu benar-benar hanya akan tidak sinkron jika ada lebih dari satu unit eksekusi.
sumber
Tidak, panggilan tidak sinkron tidak selalu melibatkan utas.
Mereka biasanya memulai semacam operasi yang berlanjut secara paralel dengan penelepon. Tetapi operasi itu mungkin ditangani oleh proses lain, oleh OS, oleh perangkat keras lain (seperti pengontrol disk), oleh beberapa komputer lain di jaringan, atau oleh manusia. Utas bukan satu-satunya cara menyelesaikan sesuatu secara paralel.
sumber
JavaScript adalah utas tunggal dan tidak sinkron. Ketika Anda menggunakan XmlHttpRequest, misalnya, Anda memberinya fungsi panggilan balik yang akan dieksekusi secara tidak sinkron ketika respons kembali.
John Resig memiliki penjelasan yang bagus tentang masalah terkait tentang bagaimana timer bekerja dalam JavaScript .
sumber
Multi threading mengacu pada lebih dari satu operasi yang terjadi dalam proses yang sama. Sementara pemrograman async tersebar di seluruh proses. Misalnya jika operasi saya memanggil layanan web, Utas tidak perlu menunggu hingga layanan web kembali. Di sini kita menggunakan pemrograman async yang memungkinkan utas tidak menunggu proses di mesin lain selesai. Dan ketika mulai mendapatkan respons dari layanan web, ia dapat menyela utas utama untuk mengatakan bahwa layanan web telah selesai memproses permintaan. Sekarang utas utama dapat memproses hasilnya.
sumber
Windows selalu memiliki pemrosesan asinkron sejak waktu non preemptive (versi 2.13, 3.0, 3.1, dll) menggunakan loop pesan, jauh sebelum mendukung utas nyata. Jadi untuk menjawab pertanyaan Anda, tidak, tidak perlu membuat utas untuk melakukan pemrosesan asinkron.
sumber
Panggilan asinkron bahkan tidak perlu terjadi pada sistem / perangkat yang sama seperti yang memanggil panggilan. Jadi, jika pertanyaannya adalah, apakah panggilan tidak sinkron memerlukan utas dalam proses saat ini, jawabannya adalah tidak. Namun, harus ada utas eksekusi di suatu tempat yang memproses permintaan asinkron.
Utas eksekusi adalah istilah yang tidak jelas. Dalam sistem penugasan kooperatif seperti Macintosh awal dan OS Windows, untaian eksekusi bisa saja merupakan proses yang sama yang membuat permintaan menjalankan tumpukan lain, penunjuk instruksi, dll. Namun, ketika orang umumnya berbicara tentang panggilan tidak sinkron. , mereka biasanya berarti panggilan yang ditangani oleh utas lain jika itu adalah proses dalam (yaitu dalam proses yang sama) atau dengan proses lain jika itu adalah proses antar.
Perhatikan bahwa komunikasi antar-proses (atau antar-proses) (IPC) umumnya digeneralisasi untuk memasukkan komunikasi antar-proses, karena teknik untuk mengunci, dan menyinkronkan data biasanya sama, terlepas dari proses apa yang dijalankan oleh utas terpisah dari eksekusi.
sumber
Beberapa sistem memungkinkan Anda memanfaatkan konkurensi dalam kernel untuk beberapa fasilitas menggunakan panggilan balik. Untuk contoh yang agak tidak jelas, callback IO asinkron digunakan untuk mengimplementasikan internet non-blocking kembali pada hari-hari multitasking Mac Sistem 6-8 yang tidak ada preemptive.
Dengan cara ini Anda memiliki aliran eksekusi bersamaan "di" program Anda tanpa utas seperti itu .
sumber
Asynchronous berarti Anda tidak memblokir program Anda menunggu sesuatu (panggilan fungsi, perangkat, dll) selesai. Itu dapat diimplementasikan dalam utas terpisah, tetapi juga umum untuk menggunakan utas khusus untuk tugas-tugas sinkron dan berkomunikasi melalui beberapa jenis sistem acara dan dengan demikian mencapai perilaku seperti tidak sinkron.
Ada contoh program asinkron berulir tunggal. Sesuatu seperti:
sumber
Sifat panggilan asinkron adalah sedemikian rupa sehingga, jika Anda ingin aplikasi terus berjalan saat panggilan sedang berlangsung, Anda akan perlu menelurkan utas baru, atau setidaknya memanfaatkan utas lain yang telah Anda buat semata-mata untuk tujuan menangani callback asinkron.
Kadang-kadang, tergantung pada situasinya, Anda mungkin ingin memanggil metode asinkron tetapi membuatnya tampak bagi pengguna untuk menjadi sinkron (yaitu, blok sampai metode asinkron mengisyaratkan bahwa itu sudah selesai). Ini dapat dicapai melalui API Win32 seperti WaitForSingleObject .
sumber