Bagaimana cara mengartikulasikan perbedaan antara pemrograman asinkron dan paralel?

141

Banyak platform mempromosikan asinkronisme dan paralelisme sebagai cara untuk meningkatkan daya tanggap. Saya memahami perbedaannya secara umum, tetapi sering merasa sulit untuk mengartikulasikan dalam pikiran saya sendiri, serta untuk orang lain.

Saya seorang programmer sehari-hari dan cukup sering menggunakan async & callback. Paralelisme terasa eksotis.

Tapi saya merasa mereka mudah digabungkan, terutama pada tingkat desain bahasa. Akan menyukai penjelasan yang jelas tentang bagaimana mereka berhubungan (atau tidak), dan kelas program di mana masing-masing paling baik diterapkan.

Matt Sherman
sumber
Saya menulis posting blog tentang hubungan antara pemrograman asynchronous dan paralel - anat-async.blogspot.com/2018/08/…
Alexei Kaigorodov
6
paralelisme adalah ketika sesuatu terjadi secara bersamaan. Asinkronitas adalah saat Anda tidak repot-repot menunggu hasil tindakan dilanjutkan. Anda hanya pergi tidur dan pada suatu saat nanti hasilnya datang, bunyikan bel Anda, Anda bangun dan melanjutkan dari sana. Eksekusi asinkron dapat terjadi secara serial dalam satu thread saja. (cukup banyak yang dilakukan javascript)
Thanasis Ioannidis

Jawaban:

88

Ketika Anda menjalankan sesuatu secara asinkron, artinya itu tidak memblokir, Anda menjalankannya tanpa menunggu sampai selesai dan melanjutkan dengan hal-hal lain. Paralelisme berarti menjalankan banyak hal pada waktu yang sama, secara paralel. Paralelisme berfungsi dengan baik ketika Anda dapat memisahkan tugas menjadi beberapa bagian pekerjaan yang independen.

Ambil contoh rendering frame animasi 3D. Untuk merender animasi membutuhkan waktu lama jadi jika Anda meluncurkan render itu dari dalam perangkat lunak pengeditan animasi Anda, Anda akan memastikannya berjalan secara asinkron sehingga tidak mengunci UI Anda dan Anda dapat terus melakukan hal-hal lain. Sekarang, setiap bingkai animasi itu juga dapat dianggap sebagai tugas individual. Jika kami memiliki beberapa CPU / Core atau beberapa mesin yang tersedia, kami dapat membuat beberapa frame secara paralel untuk mempercepat beban kerja secara keseluruhan.

CodeMan
sumber
Biarkan saya melihat apakah saya mengerti. Tugas paralel untuk merender bingkai yang berbeda harus tersebar di beberapa CPU / inti. Itu tidak ada hubungannya dengan waktu penyelesaian tugas, atau apakah tugas itu memblokir sesuatu yang lain. Ini hanya berarti sekelompok CPU akan melakukannya bersama-sama dan membuat hasilnya tersedia seolah-olah berjalan pada satu CPU super cepat. Baik?
1
"Untuk merender animasi membutuhkan waktu lama jadi jika Anda meluncurkan render itu dari dalam perangkat lunak pengedit animasi Anda, Anda akan memastikan (...)". Apa?
Untuk bagian animasi 3D: Pertama-tama, Anda TIDAK PERNAH menjalankan program grafik 3D dengan menghasilkan bingkai pada CPU - setiap orang waras akan segera menyarankan untuk menggunakan GPU. Kedua, jika kita melakukan ini (sangat tidak disarankan) kita akan menggunakan pengatur waktu untuk mengukur berapa banyak frame yang dapat kita render, jika tidak kita bisa berakhir hanya membangun tumpukan Tugas render call yang belum selesai. Namun maksud Anda benar-benar valid dengan sebagian besar aplikasi rendering 2D yang merender berdasarkan peristiwa input per pengguna.
ワ イ き ん ぐ
1
Asynchronous dan non-blocking adalah paradigma yang berbeda .
Marquis dari Lorne
75

Saya percaya perbedaan utama adalah antara konkurensi dan paralelisme .

Async dan Callback umumnya merupakan cara (alat atau mekanisme) untuk mengekspresikan konkurensi, yaitu sekumpulan entitas yang mungkin berbicara satu sama lain dan berbagi sumber daya. Dalam kasus async atau komunikasi callback tersirat sementara berbagi sumber daya bersifat opsional (pertimbangkan RMI di mana hasil dihitung di mesin jarak jauh). Sebagaimana dicatat dengan benar, ini biasanya dilakukan dengan mempertimbangkan sikap tanggap; untuk tidak menunggu peristiwa latensi yang lama .

Pemrograman paralel biasanya memiliki throughput sebagai tujuan utama sementara latensi, yaitu waktu penyelesaian untuk satu elemen, mungkin lebih buruk daripada program sekuensial yang setara.

Untuk lebih memahami perbedaan antara konkurensi dan paralelisme, saya akan mengutip dari model Probabilistik untuk konkurensi Daniele Varacca yang merupakan rangkaian catatan yang bagus untuk teori konkurensi:

Model komputasi adalah model konkurensi ketika ia mampu merepresentasikan sistem yang terdiri dari komponen otonom independen, mungkin berkomunikasi satu sama lain. Gagasan tentang konkurensi tidak boleh disamakan dengan gagasan paralelisme. Perhitungan paralel biasanya melibatkan kontrol pusat yang mendistribusikan pekerjaan di antara beberapa prosesor. Dalam konkurensi kami menekankan kemandirian komponen, dan fakta bahwa mereka berkomunikasi satu sama lain. Paralelisme seperti Mesir kuno, tempat Firaun memutuskan dan para budak bekerja. Konkurensi seperti Italia modern, di mana setiap orang melakukan apa yang mereka inginkan, dan semua menggunakan telepon seluler.

Kesimpulannya , pemrograman paralel adalah kasus konkurensi khusus di mana entitas terpisah berkolaborasi untuk mendapatkan kinerja dan throughput yang tinggi (umumnya).

Async dan Callback hanyalah mekanisme yang memungkinkan programmer untuk mengekspresikan konkurensi. Pertimbangkan bahwa pola desain pemrograman paralel yang terkenal seperti master / pekerja atau peta / pengurangan diimplementasikan oleh kerangka kerja yang menggunakan mekanisme tingkat yang lebih rendah (asinkron) untuk mengimplementasikan interaksi terpusat yang lebih kompleks .

igon
sumber
39

Artikel ini menjelaskannya dengan sangat baik: http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming

Ini tentang pemrograman asynchronous:

Panggilan asinkron digunakan untuk mencegah "pemblokiran" dalam aplikasi. Panggilan [seperti] akan berputar di thread yang sudah ada (seperti thread I / O) dan melakukan tugasnya bila bisa.

ini tentang pemrograman paralel:

Dalam pemrograman paralel Anda masih memecah pekerjaan atau tugas, tetapi perbedaan utamanya adalah Anda memutar utas baru untuk setiap bagian pekerjaan

dan ini ringkasannya:

panggilan asynchronous akan menggunakan thread yang sudah digunakan oleh sistem dan pemrograman paralel mengharuskan pengembang untuk memecah work up, spinup, dan thread yang dibutuhkan .

Paul
sumber
3
Artikel ini> semua jawaban di sini (kecuali yang ini tentu saja!)
FellyTone84
1
Terima kasih untuk tautannya. Jadi ... secara umum , gunakan panggilan async saat berkomunikasi dari UI ke server (atau dari klien ke layanan web). Gunakan thread paralel di server atau layanan web, serta di lapisan bisnis Anda.
goku_da_master
18

Pemahaman dasar saya adalah:

Pemrograman asinkron memecahkan masalah menunggu operasi yang mahal selesai sebelum Anda dapat melakukan hal lain. Jika Anda bisa menyelesaikan hal-hal lain sambil menunggu operasi selesai maka itu hal yang baik. Contoh: menjaga UI tetap berjalan saat Anda pergi dan mengambil lebih banyak data dari layanan web.

Pemrograman paralel terkait tetapi lebih mementingkan pemecah tugas besar menjadi potongan-potongan kecil yang dapat dihitung pada saat yang sama. Hasil potongan yang lebih kecil kemudian dapat digabungkan untuk menghasilkan hasil yang keseluruhan. Contoh: penelusuran sinar di mana warna setiap piksel pada dasarnya tidak bergantung.

Mungkin lebih rumit dari itu, tapi saya pikir itulah perbedaan dasarnya.

Andrew Cooper
sumber
Ini sudah bagus tetapi cukup salah. Seperti asinkronitas, paralelisme juga memungkinkan aliran kontrol berlanjut tanpa menunggu tindakan selesai. Perbedaan utamanya adalah paralelisme bergantung pada perangkat keras.
serkan
15

Saya cenderung memikirkan perbedaan dalam istilah-istilah ini:

Asynchronous: Pergi dan lakukan tugas ini, setelah Anda selesai kembali dan beri tahu saya dan bawa hasilnya. Sementara itu, saya akan melanjutkan hal-hal lain.

Paralel: Saya ingin Anda melakukan tugas ini. Jika itu membuatnya lebih mudah, dapatkan beberapa orang untuk membantu. Ini mendesak, jadi saya akan menunggu di sini sampai Anda kembali dengan hasilnya. Saya tidak bisa melakukan apa-apa lagi sampai Anda kembali.

Tentu saja tugas asinkron mungkin menggunakan paralelisme, tetapi perbedaannya - setidaknya menurut saya - adalah apakah Anda melanjutkan hal-hal lain saat operasi sedang dilakukan atau jika Anda menghentikan semuanya sepenuhnya sampai hasilnya masuk.

Leonard H. Martin
sumber
14

async : Lakukan ini sendiri di tempat lain dan beri tahu saya setelah Anda selesai (panggilan balik). Pada saat saya bisa terus melakukan pekerjaan saya.

masukkan deskripsi gambar di sini

paralel : Pekerjakan orang (utas) sebanyak yang Anda inginkan dan bagi pekerjaan kepada mereka untuk menyelesaikan lebih cepat dan beri tahu saya (panggilan balik) setelah Anda selesai. Pada saat saya mungkin terus melakukan pekerjaan saya yang lain.

masukkan deskripsi gambar di sini

Perbedaan utamanya adalah paralelisme sebagian besar bergantung pada perangkat keras.

serkan
sumber
11

Ini adalah pertanyaan tentang urutan eksekusi.

Jika A asinkron dengan B, maka saya tidak dapat memprediksi sebelumnya kapan subbagian dari A akan terjadi sehubungan dengan subbagian dari B.

Jika A sejajar dengan B, maka hal-hal di A terjadi bersamaan dengan hal-hal di B. Namun, urutan eksekusi masih dapat ditentukan.

Mungkin kesulitannya adalah kata asynchronous samar-samar.

Saya menjalankan tugas asinkron ketika saya memberi tahu kepala pelayan saya untuk pergi ke toko untuk membeli lebih banyak anggur dan keju, dan kemudian melupakannya dan mengerjakan novel saya sampai dia mengetuk pintu ruang belajar lagi. Paralelisme terjadi di sini, tetapi kepala pelayan dan saya terlibat dalam tugas yang berbeda secara fundamental dan kelas sosial yang berbeda, jadi kami tidak menerapkan label itu di sini.

Tim pelayan saya bekerja secara paralel ketika masing-masing dari mereka sedang mencuci jendela yang berbeda.

Tim pendukung mobil balap saya paralel secara asinkron di mana setiap tim bekerja pada ban yang berbeda dan mereka tidak perlu berkomunikasi satu sama lain atau mengelola sumber daya bersama saat mereka melakukan pekerjaan mereka.

Tim sepak bola (alias sepak bola) saya melakukan pekerjaan paralel karena setiap pemain secara mandiri memproses informasi tentang lapangan dan bergerak di atasnya, tetapi mereka tidak sepenuhnya asinkron karena mereka harus berkomunikasi dan menanggapi komunikasi orang lain.

Marching band saya juga paralel karena setiap pemain membaca musik dan mengontrol instrumen mereka, tetapi mereka sangat sinkron: mereka bermain dan berbaris dalam waktu satu sama lain.

Gatling gun cammed dapat dianggap paralel, tetapi semuanya 100% sinkron, jadi seolah-olah satu proses sedang bergerak maju.

Richard
sumber
9

Mengapa Asynchronous?

Dengan aplikasi saat ini yang semakin banyak terhubung dan juga berpotensi menjalankan tugas yang berjalan lama atau operasi pemblokiran seperti I / O Jaringan atau Operasi Database. Jadi, sangat penting untuk menyembunyikan latensi operasi ini dengan memulainya di latar belakang dan kembali ke antarmuka pengguna secepat mungkin. Di sini Asynchronous masuk ke dalam gambar, Responsiveness .

Mengapa pemrograman paralel?

Dengan kumpulan data saat ini yang semakin besar dan komputasi yang semakin kompleks. Jadi, sangat penting untuk mengurangi waktu eksekusi operasi yang terikat dengan CPU ini, dalam hal ini, dengan membagi beban kerja menjadi beberapa bagian dan kemudian menjalankan bagian tersebut secara bersamaan. Kita bisa menyebutnya sebagai "Paralel". Jelas itu akan memberikan Kinerja tinggi untuk aplikasi kita.

Kode-EZ
sumber
6

Asynchronous Katakanlah Anda adalah titik kontak untuk klien Anda dan Anda harus responsif yaitu Anda perlu berbagi status, kompleksitas operasi, sumber daya yang diperlukan, dll kapan pun diminta. Sekarang Anda memiliki operasi yang memakan waktu untuk diselesaikan dan karenanya tidak dapat mengambil ini karena Anda harus responsif terhadap klien 24/7. Karenanya, Anda mendelegasikan operasi yang memakan waktu tersebut kepada orang lain sehingga Anda dapat bersikap responsif. Ini asynchronous.

Pemrograman paralel Katakanlah Anda memiliki tugas untuk membaca, katakanlah, 100 baris dari file teks, dan membaca satu baris membutuhkan waktu 1 detik. Karenanya, Anda memerlukan 100 detik untuk membaca file teks. Sekarang Anda khawatir klien harus menunggu 100 detik hingga operasi selesai. Karenanya Anda membuat 9 klon lagi dan membuat masing-masing klon membaca 10 baris dari file teks. Sekarang waktu yang dibutuhkan hanya 10 detik untuk membaca 100 baris. Karenanya Anda memiliki kinerja yang lebih baik.

Singkatnya, pengkodean asynchronous dilakukan untuk mencapai responsivitas dan pemrograman paralel dilakukan untuk kinerja.

Varun Shridhar
sumber
4

Asynchronous: Menjalankan metode atau tugas di latar belakang, tanpa pemblokiran. Mungkin tidak perlu dijalankan pada utas terpisah. Menggunakan Pengalihan Konteks / penjadwalan waktu.

Tugas Paralel: Setiap tugas berjalan secara paralel. Tidak menggunakan pengalihan konteks / penjadwalan waktu.

Aditya Bokade
sumber
4

Saya datang ke sini cukup nyaman dengan kedua konsep tersebut, tetapi dengan sesuatu yang tidak jelas bagi saya tentang keduanya.

Setelah membaca beberapa jawaban, saya rasa saya memiliki metafora yang benar dan berguna untuk menjelaskan perbedaannya.

Jika Anda menganggap baris kode individual Anda sebagai kartu remi yang terpisah tetapi teratur (hentikan saya jika saya menjelaskan cara kerja kartu punch jadul), maka untuk setiap prosedur terpisah tertulis, Anda akan memiliki tumpukan kartu yang unik (jangan salin & tempel!) dan perbedaan antara apa yang biasanya berjalan saat menjalankan kode secara normal dan secara asinkron bergantung pada apakah Anda peduli atau tidak.

Ketika Anda menjalankan kode, Anda menyerahkan OS satu set operasi tunggal (yang compiler atau interpreter Anda pecahkan kode level "lebih tinggi" Anda) untuk diteruskan ke prosesor. Dengan satu prosesor, hanya satu baris kode yang dapat dieksekusi dalam satu waktu. Jadi, untuk mencapai ilusi menjalankan banyak proses pada saat yang sama, OS menggunakan teknik di mana ia mengirimkan prosesor hanya beberapa baris dari proses tertentu pada satu waktu, beralih di antara semua proses sesuai dengan tampilannya. cocok. Hasilnya adalah beberapa proses yang menunjukkan kemajuan kepada pengguna akhir pada waktu yang tampaknya bersamaan.

Untuk metafora kita, hubungannya adalah OS selalu mengocok kartu sebelum mengirimnya ke prosesor. Jika tumpukan kartu Anda tidak bergantung pada tumpukan lain, Anda tidak menyadari bahwa tumpukan Anda berhenti dipilih saat tumpukan lain menjadi aktif. Jadi, jika Anda tidak peduli, itu tidak masalah.

Namun, jika Anda benar-benar peduli (misalnya, ada banyak proses - atau tumpukan kartu - yang saling bergantung satu sama lain), pengacakan OS akan mengacaukan hasil Anda.

Menulis kode asynchronous membutuhkan penanganan ketergantungan antara urutan eksekusi terlepas dari apa pengurutan itu akhirnya. Inilah mengapa konstruksi seperti "panggilan balik" digunakan. Mereka berkata kepada prosesor, "hal berikutnya yang harus dilakukan adalah memberi tahu tumpukan lain apa yang kami lakukan". Dengan menggunakan alat tersebut, Anda dapat yakin bahwa tumpukan lain akan diberi tahu sebelum memungkinkan OS untuk menjalankan lebih banyak instruksinya. ("If call_back == false: send (no_operation)" - tidak yakin apakah ini benar-benar cara penerapannya, tetapi secara logis, menurut saya ini konsisten.)

Untuk proses paralel, perbedaannya adalah Anda memiliki dua tumpukan yang tidak peduli satu sama lain dan dua pekerja untuk memprosesnya. Pada akhirnya, Anda mungkin perlu menggabungkan hasil dari dua tumpukan, yang kemudian akan menjadi masalah sinkronisitas tetapi, untuk eksekusi, Anda tidak peduli lagi.

Tidak yakin apakah ini membantu tetapi, saya selalu menemukan banyak penjelasan bermanfaat. Selain itu, perhatikan bahwa eksekusi asinkron tidak dibatasi ke komputer individual dan prosesornya. Secara umum, ini berkaitan dengan waktu, atau (bahkan lebih umum lagi) urutan peristiwa. Jadi jika Anda mengirim tumpukan dependen A ke node jaringan X dan tumpukan B yang digabungkan ke Y, kode asinkron yang benar harus dapat memperhitungkan situasi tersebut seolah-olah itu berjalan secara lokal di laptop Anda.

philrea
sumber
2

Umumnya, hanya ada dua cara Anda dapat melakukan lebih dari satu hal setiap saat. Yang satu tidak sinkron , yang lainnya paralel .

Dari level tinggi, seperti server populer NGINX dan pustaka Python Tornado yang terkenal , keduanya sepenuhnya memanfaatkan paradigma asynchronous dimana Single thread server dapat melayani ribuan klien secara bersamaan (beberapa IOloop dan callback ). Menggunakan ECF (kontrol pengecualian mengikuti) yang dapat menerapkan paradigma pemrograman asinkron. jadi asynchronous terkadang tidak benar-benar melakukan sesuatu secara simultan, tetapi beberapa pekerjaan io terikat, asynchronous benar-benar dapat meningkatkan kinerja.

The paralel paradigma selalu mengacu multi-threading, dan multiprocessing. Ini sepenuhnya dapat menggunakan prosesor multi-core, melakukan banyak hal secara bersamaan.

ideoutrea.dll
sumber
-1

Ringkasan dari semua jawaban di atas

  1. komputasi paralel:

▪ memecahkan masalah throughput. Khawatir dengan memecah tugas besar menjadi bagian yang lebih kecil

▪ terkait dengan mesin (diperlukan multi mesin / inti / cpu / prosesor), misalnya: master slave, pengurangan peta.

Perhitungan paralel biasanya melibatkan kontrol pusat yang mendistribusikan pekerjaan di antara beberapa prosesor

  1. asinkron:

▪ memecahkan masalah latensi, yaitu masalah 'menunggu' untuk menyelesaikan operasi yang mahal sebelum Anda dapat melakukan apa pun

▪ terkait dengan utas (diperlukan multi utas)

Threading (menggunakan Thread, Runnable, Executor) adalah salah satu cara mendasar untuk melakukan operasi asinkron di Java

Vyshnav Ramesh Thrissur
sumber