Saya tertarik untuk belajar pemrograman bersamaan, dengan fokus pada level aplikasi / pengguna (bukan pemrograman sistem). Saya mencari bahasa pemrograman tingkat tinggi modern yang menyediakan abstraksi intuitif untuk menulis aplikasi bersamaan. Saya ingin fokus pada bahasa yang meningkatkan produktivitas dan menyembunyikan kompleksitas pemrograman bersamaan.
Untuk memberikan beberapa contoh, saya tidak mempertimbangkan opsi yang baik untuk menulis kode multithreaded di C, C ++, atau Java karena IMHO produktivitas saya berkurang dan model pemrograman mereka tidak intuitif. Di sisi lain, bahasa yang meningkatkan produktivitas dan menawarkan abstraksi yang lebih intuitif seperti Python dan modul multiprosesor, Erlang, Clojure, Scala, dll. Akan menjadi pilihan yang baik.
Apa yang akan Anda rekomendasikan berdasarkan pengalaman Anda dan mengapa?
EDIT: Terima kasih semuanya atas jawaban Anda yang menarik. Sulit untuk membuat kesimpulan tanpa benar-benar mencoba karena ada banyak kandidat yang baik: Erlang, Clojure, Scala, Groovy, dan mungkin Haskell. Saya memilih jawaban dengan argumen yang paling meyakinkan, tetapi saya akan mencoba semua kandidat yang baik sebelum memutuskan mana yang akan dipilih :)
To give an example, I don't consider a good option writing multithreaded code in C, C++, or Java
. Mengapa?On the other hand, Python and the multiprocessing module, Erlang, Clojure, Scala, etc. are some of my options.
Lagi-lagi kenapa? Luaskan pertanyaan Anda untuk mendefinisikan dengan lebih baik apa yang sebenarnya Anda cari.begin transaction
end transaction
dan semua yang ada di dalamnya harus bebas dari kebuntuan dan berhasil atau gagal secara keseluruhan.Jawaban:
Anda hampir pasti harus melihat Clojure - menurut saya itu adalah bahasa modern terbaik untuk pemrograman multi-inti dan sangat produktif.
Atribut kunci:
Beberapa contoh kode mini dengan kemiringan konkurensi:
Secara khusus, ada baiknya menonton satu atau lebih video ini:
sumber
Anda bisa mencoba D. Ini menawarkan tiga model. Saya merekomendasikan yang pertama atau kedua.
std.concurrency . Jika Anda menggunakan modul ini untuk semua kebutuhan konkurensi Anda, maka kombinasi bahasa dan pustaka standar memberlakukan isolasi antara utas. Utas terutama berkomunikasi melalui pengiriman pesan, dengan dukungan terbatas untuk memori bersama dengan cara yang lebih mengutamakan "keselamatan pertama" dan melarang balapan data tingkat rendah. Sayangnya dokumentasi std.concurrency perlu diperbaiki, tetapi model ini didokumentasikan dalam bab gratis dari buku Andrei Alexandrescu, "Bahasa Pemrograman D".
std.parallelism . Modul ini dirancang khusus untuk paralelisme multicore daripada konkurensi kasus umum. ( Konkurensi dan paralelisme bukanlah hal yang sama, meskipun konkurensi diperlukan untuk mengimplementasikan paralelisme. ) Karena seluruh titik paralelisme adalah kinerja, std.parallelism tidak membuat jaminan isolasi karena mereka akan membuat penulisan kode paralel yang efisien menjadi sulit. Namun, ini menghilangkan banyak detail tingkat rendah yang rentan kesalahan sehingga sangat sulit untuk mengacaukan jika Anda memaralisasi beban kerja yang telah Anda verifikasi secara manual saling independen.
core.thread adalah pembungkus tingkat rendah di atas threading API khusus OS. Baik std.concurrency dan std.parallelism menggunakannya di bawah tenda, tetapi saya hanya akan merekomendasikan menggunakannya jika Anda sedang menulis perpustakaan concurrency Anda sendiri atau menemukan beberapa kasus sudut konyol yang tidak dapat dilakukan dengan baik di baik std.parallelism atau std .concurrency. Tidak seorang pun harus menggunakan sesuatu tingkat rendah ini untuk pekerjaan sehari-hari.
sumber
Erlang jelas merupakan pilihan yang bagus, tetapi sesuatu yang sedikit lebih praktis adalah Go , bahasa baru Google.
Itu tidak begitu jauh dari bahasa umum lainnya, jadi biasanya mudah didapat jika Anda sudah tahu bahasa 'mudah' lainnya. Banyak orang membandingkannya dengan Python atau bahkan Lua dalam hal seberapa 'nyaman' itu untuk diprogram.
sumber
Lihatlah Pemrograman Paralel Microsoft untuk .net. Ini sangat intuitif.
sumber
Baik Erlang maupun Scala memiliki konkurensi berbasis aktor , yang menurut saya sangat intuitif dan mudah dipelajari.
sumber
Saya belajar tentang Haskell sekarang, dan membaca makalah ini telah meyakinkan saya bahwa Haskell adalah pilihan yang baik untuk pemrograman bersamaan. Karena ini murni fungsional (sistem tipe tahu apakah suatu fungsi melakukan input, output, atau membaca / memodifikasi keadaan global), ia dapat melakukan hal-hal seperti Software Transactional Memory (diringkas dengan sangat baik dalam makalah di atas) yang berperilaku sama dengan transaksi dalam database - Anda mendapatkan banyak hal baik seperti atomicity dengan hanya sedikit gula tambahan. AFAIK, benang Haskell juga sangat ringan. Selain hal-hal ini, fakta bahwa Haskell adalah fungsional murni memungkinkan bahkan tugas-tugas sederhana dijalankan secara paralel dengan sedikit lebih dari satu kata kunci (par). sumber
sumber
Bahasa GO Google memiliki beberapa alat yang menarik untuk konkurensi - itu akan menjadi hal lain yang menyenangkan untuk dicoba. Lihat: http://golang.org/doc/effective_go.html#concurrency dan bacalah sedikit untuk contoh.
sumber
Dalam versi berikutnya, C # membuatnya lebih mudah daripada yang ditunjukkan diagram itu. Ada dua kata kunci baru Async dan Await.
Async digunakan sebagai pengubah fungsi dan mengatakan "operasi ini melakukan tugasnya di utas lain.
Menunggu digunakan dalam fungsi Async, dan di sinilah keajaiban terjadi. Pada dasarnya Await memberi tahu kompiler untuk menjalankan operasi mengikuti kata kunci dalam utas terpisah dan menunggu hasilnya. Kode apa pun setelah panggilan tunggu berjalan setelah operasi.
JUGA, operasi menyinkronkan ke utas panggilan (jadi jika Anda melakukan operasi asynch sebagai respons terhadap klik tombol, Anda tidak perlu memposting kembali secara manual ke utas UI). Dua kata kunci kecil dan Anda mendapatkan banyak kekuatan konkurensi. Baca lebih lanjut di sini
sumber
Saya masih merekomendasikan C ++. Lebih dari mampu abstraksi yang diperlukan untuk menulis kode bersamaan yang layak. Kemungkinan besar adalah bahwa Anda hanya memiliki perpustakaan yang buruk untuk melakukan pekerjaan itu, karena perpustakaan yang baik untuk melakukan pekerjaan itu relatif baru, dan memang, pengetahuan untuk menggunakan C ++ dengan baik tidak sepenuhnya umum. TBB Intel hanya ada selama beberapa tahun, dan PPL Microsoft hanya dikirimkan sejak tahun lalu.
Jika Anda menggunakan sesuatu seperti TBB atau PPL, maka kode konkuren, yah, tidak sepenuhnya sepele untuk ditulis, sejauh konkurensi tidak pernah sepele, tetapi jauh dari sulit. Jika Anda menggunakan pthreads atau Win32 utas secara langsung, maka tidak heran Anda tidak menyukainya - Anda praktis menulis assembler dengan fungsi-fungsi seperti itu. Tetapi dengan PPL, maka Anda berbicara tentang algoritma fungsional standar yang diparalelkan untuk Anda, struktur data umum untuk akses bersamaan, dan hal-hal baik semacam itu.
sumber
std::thread
(ataustd::tr1::thread
). Ini sebenarnya abstraksi yang sangat bagus, IMO.boost::thread
hanyalah pembungkus OS dengan sedikit RAII. PPL dan TBB adalah algoritma konkuren, wadah, dll.Sebuah plug untuk Ada diperlukan di sini, karena memiliki semua abstraksi tingkat atas untuk paralelisme & konkurensi. atau dikenal sebagai penugasan . Juga ketika OP meminta intuitif (kriteria subyektif!) Saya pikir pendekatan yang berbeda untuk dunia java-sentris mungkin dihargai.
sumber
Saya akan menyarankan Groovy / Java / GPars jika Anda dapat berbasis JVM karena memungkinkan untuk aktor, aliran data, berkomunikasi proses sekuensial (CSP), paralelisme data, perangkat lunak memori transaksional (STM), agen, ... Intinya di sini adalah bahwa ada ada banyak model konkurensi dan paralelisme tingkat tinggi yang masing-masing memiliki "sweet spot" yang berbeda. Anda tidak ingin menggunakan model yang tidak selaras dengan solusi untuk masalah yang Anda coba buat. Bahasa dan kerangka kerja dengan hanya satu model memaksa Anda melakukan peretasan algoritma.
Tentu saja saya bisa dianggap bias karena saya kontributor Groovy dan GPars. Di sisi lain saya bekerja dengan CSP dan Python, lih. Python-CSP.
Poin selanjutnya adalah bahwa pertanyaan awal adalah tentang belajar, bukan tentang menulis sistem produksi. Jadi kombinasi Groovy / Java / GPars adalah cara yang baik untuk belajar bahkan jika pekerjaan produksi akhirnya dilakukan dalam C ++ menggunakan sesuatu seperti Just :: Thread Pro atau TBB daripada berbasis JVM.
(Beberapa tautan URL yang masuk akal harus dihapus karena panik tentang spamming oleh situs host.)
sumber
Bagaimana dengan Clojure? Anda dapat menggunakan Swing misalnya tetapi menikmati fasilitas pemrograman bersamaan Clojure? Clojure memiliki integrasi Java yang cukup baik.
Juga, sudahkah Anda mempertimbangkan kerangka Java 7 Fork / Bergabung ?
sumber
Anda mungkin juga ingin melihat perpustakaan Groovy dan GPars . GPars BTW agak mirip dengan .NET Parallel Extension yang disebutkan dalam jawaban lain, tetapi sintaksis fleksibel Groov membuatnya lebih baik dibaca dalam beberapa keadaan.
sumber
Scala telah disebutkan beberapa kali dalam pertanyaan dan jawaban, tetapi saya belum melihat referensi ke Akka yang merupakan implementasi aktor yang dapat digunakan dengan Scala dan Java.
sumber
Saya pikir itu tergantung pada apa yang sedang Anda bangun. Aplikasi desktop, atau server? Saya pernah mendengar bahwa (tetapi tidak memiliki pengalaman pribadi) node.js bagus untuk pemrograman bersamaan untuk server (baik dalam hal menulis kode dan dalam kinerja). Jika saya ingin menulis aplikasi server baru, saya mungkin akan mencobanya. Tidak yakin tentang aplikasi desktop ... Saya telah menulis cukup banyak hal dalam C # dan ada beberapa alat yang menyembunyikan kompleksitas dengan baik, meskipun untuk kasus lain Anda harus menghadapinya secara langsung.
sumber
Saya mungkin mendapat untung karena ini, tetapi apakah Anda sudah membaca bab 7 dari TAOUP ? Bagian yang saya pikirkan secara spesifik adalah thread vs proses. Saya telah menemukan bahwa konsep pemrosesan bersamaan membuat kebanyakan orang berpikir tentang utas, namun saya belum pernah melihat contoh di mana utas lebih mudah dan lebih cepat digunakan daripada memunculkan proses anak.
Anda mencari tahu semua detail penanganan konkurensi kepada orang-orang pintar yang membangun OS Anda. Sudah ada banyak metode komunikasi di tempat, dan Anda tidak perlu khawatir tentang mengunci sumber daya bersama. Pada dasarnya, utas adalah peretasan efisiensi, yang berada di bawah aturan optimasi. Jangan optimalkan jika Anda belum menguji kebutuhan.
Temukan pustaka subproses yang bagus, seperti utusan untuk python . Atau Anda bisa menulis beberapa program terpisah dalam C, dan menulis program "master" lain untuk menggunakan garpu dan pipa untuk menelurkan dan berkomunikasi dengan subproses.
sumber