Bahasa pemrograman modern dengan abstraksi pemrograman konkuren intuitif [ditutup]

40

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 :)

faif
sumber
21
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.
yannis
2
Jadi, apakah Anda ingin belajar pemrograman paralel dengan semua Gotcha atau Anda ingin menyembunyikan beberapa kompleksitasnya dan fokus pada produktivitas?
MaR
@MaR Fokus pada produktivitas dan sembunyikan kerumitannya :)
sakisk
Catat saja bahwa banyak konsep penting dihindari (beberapa mungkin mengatakan dipecahkan) dalam beberapa bahasa ini dan oleh karena itu C benar-benar bahasa terbaik untuk mempelajari konkurensi. (Atau setidaknya sepertinya begitu bagi saya; saya tidak cukup tahu tentang semua bahasa yang terdaftar). Meningkatkan produktivitas seringkali bertentangan dengan pembelajaran yang komprehensif.
user606723
1
@DeadMG Menurunnya produktivitas adalah masalah mereka. Saya tidak ingin fokus pada sintaks bahasa alih-alih masalah. Saya pasti tidak ingin berakhir dengan kebuntuan. Sebagai contoh sederhana, saya ingin menggunakan pernyataan sederhana seperti begin transaction end transactiondan semua yang ada di dalamnya harus bebas dari kebuntuan dan berhasil atau gagal secara keseluruhan.
sakisk

Jawaban:

33

Anda hampir pasti harus melihat Clojure - menurut saya itu adalah bahasa modern terbaik untuk pemrograman multi-inti dan sangat produktif.

Atribut kunci:

  • Ini adalah bahasa fungsional , yang merupakan keuntungan bagi konkurensi dan kemampuan Anda untuk berkembang menggunakan abstraksi tingkat yang lebih tinggi. Ini fitur struktur data persisten sepenuhnya abadi dan urutan malas yang akan akrab bagi siapa saja dengan pengalaman dalam bahasa fungsional seperti Haskell.
  • Ini fitur sistem memori transaksional perangkat lunak yang sangat baru untuk akses bebas kunci bersamaan ke keadaan bisa berubah. Membuat kode concurrency-safe seringkali sesederhana membungkusnya dalam blok (dosync ....).
  • Ini adalah Lisp - yang membuatnya sangat kuat untuk metaprogramming dan pembuatan kode berbasis makro. Ini dapat membawa keuntungan produktivitas yang signifikan (esai oleh Paul Graham - "Beating The Averages")
  • Ini adalah bahasa JVM - jadi Anda tidak hanya mendapatkan akses ke berbagai perpustakaan dan alat di ekosistem Java, Anda juga mendapat manfaat dari upaya rekayasa besar yang telah dilakukan untuk menjadikan JVM platform yang efektif untuk aplikasi sisi-server secara bersamaan. Untuk tujuan praktis, ini memberikan keuntungan besar dibandingkan bahasa yang tidak memiliki fondasi untuk membangun.
  • Ini dinamis - yang menghasilkan kode yang sangat ringkas dan banyak produktivitas. Namun perhatikan bahwa Anda dapat menggunakan petunjuk tipe statis opsional untuk kinerja jika diperlukan.
  • Bahasa ini dirancang berdasarkan abstraksi yang agak sulit untuk dijelaskan tetapi efeknya adalah Anda mendapatkan serangkaian fitur yang relatif ortogonal yang dapat Anda gabungkan untuk menyelesaikan masalah Anda. Contohnya adalah abstraksi urutan, yang memungkinkan Anda untuk menulis kode yang berhubungan dengan setiap jenis objek "berurutan" (yang mencakup segala sesuatu dari daftar, string, array Java, urutan malas tak terbatas, baris yang dibaca dari file dll.)
  • Ada komunitas yang hebat - membantu, berwawasan luas tetapi yang paling penting sangat pragmatis - fokus di Clojure umumnya adalah "menyelesaikan sesuatu".

Beberapa contoh kode mini dengan kemiringan konkurensi:

;; define and launch a future to execute do-something in another thread
(def a (future (do-something)))

;; wait for the future to finish and print its return value
(println @a)

;; call two functions protected in a single STM transaction
(dosync
  (function-one)
  (function-two))

Secara khusus, ada baiknya menonton satu atau lebih video ini:

mikera
sumber
21
Tujuan dari deklarasi tipe statis dalam bahasa-bahasa yang diketik dengan kuat bukanlah untuk "meningkatkan kinerja di mana diperlukan," dan saya menjadi muak dengan para pendukung Lisp yang menelusuri si tua jerami. Ketik deklarasi memiliki dua tujuan: untuk memberikan jaminan waktu kompilasi tertentu kebenaran, dan untuk membuat kode lebih mudah dibaca, terutama untuk orang lain selain penulis asli. Performa yang secara inheren lebih baik yang diberikan oleh pengetikan statis hanyalah bonus.
Mason Wheeler
8
Saya harus bekerja dengan kode JavaScript pengembang lain akhir-akhir ini di tempat kerja, dan itu adalah bagian yang paling menyakitkan dari proses: tanpa jenis pada argumen fungsi, saya harus mencari di seluruh basis kode untuk mencari tahu apa yang seharusnya mereka lakukan. menjadi dan apa yang bisa mereka lakukan berdasarkan dari mana mereka dipanggil. Ini bukan masalah jika JavaScript mempertahankan sistem tipe C di samping sintaksis umumnya.
Mason Wheeler
1
@MasonWheeler: IMHO jika Anda tidak tahu cara memanggil fungsi tanpa anotasi jenis, ini masalah dengan dokumentasi (atau ketiadaan). Bahkan dalam bahasa yang diketik bebek semuanya biasanya harus memenuhi beberapa kendala tipe struktural (misalnya harus mendukung operasi aritmatika, harus dapat diubah, harus dapat diindeks, dll.). Tipe statis hanya akan membantu minimal karena mereka tidak akan memberi banyak petunjuk tentang apa fungsi tidak .
dsimcha
2
@ Alasan saya tidak pernah mengatakan bahwa tidak ada keuntungan lain dari deklarasi tipe statis. Sebenarnya saya suka deklarasi tipe statis persis alasan Anda menyatakan. Namun saya juga menyukai peningkatan produktivitas dari pengetikan dinamis. Ini adalah trade-off. Jika Anda memiliki rangkaian pengujian yang baik, saya biasanya menemukan bahwa ini mengurangi banyak kelemahan dari pengetikan dinamis baik dalam hal memastikan kebenaran dan memberikan contoh kode untuk membantu pendatang baru memahami penggunaan yang benar. YMMV.
mikera
1
@dsimcha - alternatif untuk mendesain seputar abstraksi adalah mendesain implementasi konkret. Misalnya, sebagian besar fungsi Lisp lama hanya berfungsi pada daftar tertaut yang disimpan dalam sel kontra. Anda memerlukan fungsi yang berbeda untuk struktur data yang berbeda. Di Clojure, fungsi pustaka inti bekerja pada apa pun yang berurutan (seperti pada jawabannya).
mikera
27

Anda bisa mencoba D. Ini menawarkan tiga model. Saya merekomendasikan yang pertama atau kedua.

  1. 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".

  2. 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.

  3. 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.

dsimcha
sumber
Anda seharusnya menyebutkan immutability / purity, thread penyimpanan lokal secara default dan shared yang memaksakan mutasi dalam urutan berurutan. Mereka adalah dukungan bahasa yang tidak ada dalam C / C ++ untuk menulis kode persetujuan.
deadalnix
@deadalnix: Bagi saya kebanyakan adalah detail dari model std.concurrency (bagaimana isolasi ditegakkan). Saya ingin menjaga postingan ini tetap ringkas.
dsimcha
Sebenarnya tidak. Concurency membutuhkan dukungan perpustakaan dan bahasa.
deadalnix
@deadalnix: Benar, tetapi mereka diberlakukan sebagian besar untuk mendukung std.concurrency.
dsimcha
23

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.

Javier
sumber
@faif bertanya tentang tingkat aplikasi / pengguna, bukan sistem pemrograman bersamaan. Bagaimana Erlang cocok dengan ini?
Chiron
@ Raynos: Tergantung pada komunitas.
Donal Fellows
@DonalFellows kanan Anda, saya pikir pernyataan saya terlalu sempit
Raynos
1
@Chiron: Erlang adalah bahasa pemrograman, digunakan untuk membuat aplikasi. Biasanya, aplikasi multitrocessing. Saya tidak tahu di mana itu cocok sebagai 'sistem proramming bersamaan', saya belum pernah mendengar ada OS yang ditulis dalam bahasa Erlang.
Javier
1
Setelah melihat sekilas tutorial Go, saya ingin mengatakan bahwa IMHO bahasa dengan sintaks mirip C yang menggunakan pointer (terbatas) jelas bukan bahasa modern yang meningkatkan produktivitas.
sakisk
23

Lihatlah Pemrograman Paralel Microsoft untuk .net. Ini sangat intuitif.

Banyak komputer pribadi dan workstation memiliki dua atau empat core (yaitu, CPU) yang memungkinkan beberapa utas dieksekusi secara bersamaan. Komputer dalam waktu dekat diharapkan memiliki lebih banyak core secara signifikan. Untuk memanfaatkan perangkat keras hari ini dan besok, Anda dapat memparalelkan kode Anda untuk mendistribusikan pekerjaan di banyak prosesor. Di masa lalu, paralelisasi membutuhkan manipulasi tingkat rendah dari untaian dan kunci. Visual Studio 2010 dan .NET Framework 4 meningkatkan dukungan untuk pemrograman paralel dengan menyediakan runtime baru, tipe perpustakaan kelas baru, dan alat diagnostik baru. Fitur-fitur ini menyederhanakan pengembangan paralel sehingga Anda dapat menulis kode paralel yang efisien, halus, dan dapat diukur dalam idiom alami tanpa harus bekerja secara langsung dengan utas atau kumpulan utas. http://i.msdn.microsoft.com/dynimg/IC292903.png

A ----------------------- -----
sumber
+1 Ini adalah persis apa yang dia minta. Padahal, ketika masalah terjadi, akan sulit untuk men-debug mereka tanpa pemahaman tentang konkurensi di tingkat yang lebih rendah. Belum lagi, menganggap ini sebagai pemula C # bisa membuktikan ... menarik.
P.Brian.Mackey
@ P.Brian.Mackey - Saya setuju. Namun itu tidak biasa, tidak akan sulit untuk membandingkan ini dengan menggunakan ORM ketika seseorang tidak sepenuhnya memahami model relasional dan SQL ...
Otávio Décio
1
Terutama PLINQ. Meskipun hanya berguna untuk sebagian kecil tugas, ini bisa sangat mudah digunakan.
svick
21

Baik Erlang maupun Scala memiliki konkurensi berbasis aktor , yang menurut saya sangat intuitif dan mudah dipelajari.

Model Aktor dalam ilmu komputer adalah model matematika perhitungan konkuren yang memperlakukan "aktor" sebagai primitif universal dari komputasi digital konkuren: sebagai tanggapan terhadap pesan yang diterimanya, aktor dapat membuat keputusan lokal, membuat lebih banyak aktor, mengirim lebih banyak pesan , dan menentukan bagaimana menanggapi pesan berikutnya yang diterima ... Ini telah digunakan baik sebagai kerangka kerja untuk pemahaman teoritis tentang perhitungan, dan sebagai dasar teoritis untuk beberapa implementasi praktis dari sistem bersamaan.

TMN
sumber
19

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

AlexWebr
sumber
7

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.

Pemrograman bersamaan adalah topik besar dan hanya ada ruang untuk beberapa sorotan khusus-Go di sini.

Pemrograman serentak di banyak lingkungan dipersulit oleh kehalusan yang diperlukan untuk mengimplementasikan akses yang benar ke variabel yang dibagi. Go mendorong pendekatan berbeda di mana nilai-nilai yang dibagikan dilewatkan di saluran dan, pada kenyataannya, tidak pernah dibagikan secara aktif oleh utas terpisah dari eksekusi. Hanya satu goroutine yang memiliki akses ke nilai pada waktu tertentu. Ras data tidak dapat terjadi, berdasarkan desain. Untuk mendorong cara berpikir ini, kami telah mereduksinya menjadi slogan:

Jangan berkomunikasi dengan berbagi memori; alih-alih, bagikan memori dengan berkomunikasi.

Pendekatan ini bisa ditempuh terlalu jauh. Jumlah referensi mungkin paling baik dilakukan dengan meletakkan mutex di sekitar variabel integer, misalnya. Tetapi sebagai pendekatan tingkat tinggi, menggunakan saluran untuk mengontrol akses membuatnya lebih mudah untuk menulis program yang jelas dan benar.

Salah satu cara untuk memikirkan model ini adalah dengan mempertimbangkan program khas single-threaded yang berjalan pada satu CPU. Tidak perlu sinkronisasi primitif. Sekarang jalankan instance lain seperti itu; juga tidak perlu sinkronisasi. Sekarang biarkan keduanya berkomunikasi; jika komunikasi adalah sinkronisasi, masih tidak perlu sinkronisasi lainnya. Jaringan pipa Unix, misalnya, sangat cocok dengan model ini. Meskipun pendekatan Go untuk konkurensi berasal dari Hoare's Communicating Sequential Processes (CSP), itu juga dapat dilihat sebagai jenis generalisasi yang aman dari pipa Unix ...

agas
sumber
6

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

Michael Brown
sumber
Catatan kompilator OS C # yang layak sudah mendukung C # 5, async dan menunggu.
Raynos
Pada dasarnya Await memberi tahu kompiler untuk menjalankan operasi mengikuti kata kunci dalam utas terpisah dan menunggu hasilnya. Saya ingin tahu apakah jawaban ini benar - async menunggu bukan tentang utas. Artikel ini menjelaskan bagus: Tidak ada utas
sventevit
Poin bagus. Saya kira saya berbicara terlalu sederhana tentang itu. Apa yang sebenarnya terjadi adalah "kelanjutan" dibuat yang berlangganan ke acara tugas dalam "menunggu" sedang diselesaikan. Dan ya operasi I / O tertentu dan thread.sleep () (yang pada dasarnya menanggapi gangguan jam) tidak memiliki utas. tapi bagaimana dengan Tugas yang dibuat secara manual yang tidak seperti I / O katakanlah kita membuat kalkulator fibonacci yang ditunggu? Secara teknis artikelnya benar "Tidak ada utas" tetapi pada kenyataannya tidak pernah ada, itu selalu merupakan konsep yang kami gunakan untuk menyembunyikan detail apa yang OS lakukan untuk kami.
Michael Brown
6

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.

DeadMG
sumber
1
Lihat Boost.Threads atau C ++ 0x std::thread(atau std::tr1::thread). Ini sebenarnya abstraksi yang sangat bagus, IMO.
greyfade
1
@ Greyfade: Mereka sama sekali tidak memiliki PPL atau TBB. boost::threadhanyalah pembungkus OS dengan sedikit RAII. PPL dan TBB adalah algoritma konkuren, wadah, dll.
DeadMG
6

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.

NWS
sumber
5

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.)

Russel Winder
sumber
Russel, jika Anda mau, Anda bisa memberi tahu saya apa yang ingin Anda tautkan
Dan McGrath
4

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 ?

Chiron
sumber
2

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.

Christian Horsdal
sumber
0

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.

Giorgio
sumber
Apa yang salah dengan jawaban ini? Tidak ada jawaban lain yang disebutkan akka, dan akka mengimplementasikan abstraksi tingkat tinggi untuk pemrograman bersamaan.
Giorgio
-1

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.

Aerik
sumber
-1

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.

Spencer Rathbun
sumber
3
Ini adalah kebalikan dari apa yang OP inginkan secara eksplisit ... memunculkan proses sama rendahnya dengan memunculkan thread secara manual. OP tertarik pada abstraksi tingkat tinggi konkurensi.
Konrad Rudolph