Asynchronous vs Multithreading - Apakah ada perbedaan?

133

Apakah panggilan asinkron selalu membuat utas baru? Apa perbedaan keduanya?

Apakah panggilan asinkron selalu membuat atau menggunakan utas baru?

Wikipedia mengatakan :

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?

Ted Smith
sumber
1
JavaScript tidak memiliki utas, tetapi ia memiliki panggilan metode asinkron.
Ajedi32
1
Sistem mana pun di mana satu proses mengelola beberapa sub-proses, proses kontrol dapat menyediakan operasi sub-proses yang tidak sinkron. Dalam kasus JavaScript, browser menyediakan aliran komputasi. Ketika beberapa fungsi membuat panggilan async, browser dapat menyimpan konteks untuk fungsi itu. Sekarang utas peramban yang sama dapat mengubah konteks untuk melanjutkan eksekusi fungsi lain. Sedangkan dalam program tradisional multi-utas, satu utas menjalankan satu blok fungsi untuk memungkinkan utas lain menjalankan fungsi yang berbeda. Setiap utas menjalankan fungsinya sendiri secara sinkron.
Mike

Jawaban:

82

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.

Michael Kohne
sumber
7
Jadi pada dasarnya saya benar dalam mengatakan: Multi-threading == Menggunakan banyak utas untuk memberikan manfaat pemrosesan pada tugas-tugas intensif prosesor yang [secara ideal] dapat mengambil manfaat dari beberapa prosesor, serta manfaat dalam situasi asinkron. Asynchrony == suatu proses yang melakukan hal itu, sementara keadaan yang memanggil proses tidak harus menunggu untuk menyelesaikannya. (Mungkin tidak perlu menggunakan beberapa utas untuk melakukan ini-- mis. Komponen perangkat keras lain mungkin bertanggung jawab).
Evan Sevy
6
@Michael - Bisakah Anda jelaskan bagaimana pemrograman asinkron dapat terjadi dalam satu utas dengan contoh?
Kumar Vaibhav
7
@KumarVaibhav - contoh paling umum adalah ketika utas tunggal berfungsi pada item dari antrian (misalnya, antrian pesan Windows). Jika program terbiasa mengirimkan barang ke antriannya sendiri (pola umum), maka sedikit kode yang mengirim barang tidak menunggu sampai operasi selesai, tetapi hanya mengembalikannya. Operasi akan ditangani pada waktunya oleh loop utama.
Michael Kohne
3
Mungkin ada perbedaan antara bagaimana kode ditulis dan bagaimana dijalankan. Misalnya, dalam C #, saya dapat memiliki metode yang memulai tugas async, metode saya sepenuhnya sadar async dan dapat melakukan hal-hal lain tanpa menunggu tugas selesai. Namun, CLR juga dapat memutuskan untuk menjalankan tugas saya dan menjalankannya secara serempak.
Mike
utas mana yang menjalankan tugas yang ditunggu? metode yang ditandai dengan a-sinkronisasi dijalankan secara sinkron hingga mencapai kata kunci yang menunggu, pada titik ini utas mana yang menjalankan tugas yang bisa ditunggu-tunggu ini?
102

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.

karunski
sumber
1
Dijelaskan dengan baik, Terima kasih; tapi saya punya pertanyaan di sini. Anda menyebutkan bahwa "Misalnya, jika operasi async adalah I / O, CPU tidak harus menunggu untuk I / O selesai. Hanya perlu memulai operasi". Pertanyaan saya adalah ketika program di utas tunggal, dan katakan pada baris kode 3, Anda memanggil operasi I / O, lalu bagaimana Anda bisa memulai operasi di baris 3 dan menjalankan baris 4 tanpa menunggu operasi I / O selesai ? Bagi saya, saya harus meletakkan kode di baris 3 di utas baru untuk mencapai baris 4 untuk dieksekusi tanpa menunggu penyelesaian operasi I / O. [Java pgm perspektif]
spiderman
1
alasannya adalah, Meskipun CPU tidak harus menunggu, CPU akan menunggu operasi I / O untuk menyelesaikan ... Saya percaya paragraf kedua Anda adalah jawaban untuk permintaan saya. Dalam kasus seperti itu, saya perlu menyimpulkan bahwa di Jawa, panggilan asinkron perlu dijalankan di utas yang berbeda. Tolong perbaiki saya jika saya salah atau beri tahu saya jika saya harus memposting SO qn baru
spiderman
@ spiderman Beberapa bahasa, seperti Node.js, memiliki model pemrograman async. Bahasa dan runtime menyediakan built-in yang memungkinkan baris 4 dieksekusi di utas yang sama, bahkan sebelum operasi IO selesai. Ini dicapai dengan jalur 3 yang menyediakan panggilan balik yang akan dipanggil runtime ketika IO selesai.
jrahhali
@ spiderman mungkin ... fungsi Async OS hanya mengembalikan false atau sesuatu secara langsung.
Byeongin Yoon
18

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.

Jason Orendorff
sumber
12

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 .

George V. Reilly
sumber
12

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.

Murugan Gopalan
sumber
Saya akan sedikit tidak setuju. Saya menulis satu server HTTP berulir yang menangani beberapa permintaan secara simultan menggunakan penyelesaian Iyn async. Async tidak memerlukan hal-hal untuk terjadi di beberapa jalur eksekusi, itu hanya berarti beberapa aliran komputasi dapat tumpang tindih. Cara lain untuk melihatnya adalah bahwa pada OS berulir tunggal, saya dapat memiliki 2 proses yang berjalan "secara bersamaan". Dari sudut pandang setiap proses, mereka berjalan secara sinkron. Namun, dari sudut pandang OS, itu beroperasi async.
Mike
11

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.

Otávio Décio
sumber
@dmckee - menarik bagaimana berbagai sistem berevolusi dengan cara yang sama.
Otávio Décio
8

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.

Mike
sumber
7

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 .

dmckee --- mantan kucing moderator
sumber
5

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:

...do something
...send some async request
while (not done)
    ...do something else
    ...do async check for results
Milan Babuškov
sumber
2

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 .

LeopardSkinPillBoxHat
sumber
Ini berlaku pada beberapa sistem, tetapi tidak semua. Unix tidak mengharuskan Anda untuk menelurkan atau menggunakan utas lain, kecuali jika Anda memanggil kernel utas lainnya, yang saya kira adalah salah satu cara untuk melihatnya.
Craig S
Ini juga tidak berlaku untuk Windows. I / O yang tumpang tindih, misalnya, tidak sinkron.
Jason Orendorff