Pemrograman bersamaan Erlang dan Go, perbedaan obyektif antara CSP dan Aktor?

19

Saya sedang mencari pemrograman bersamaan dalam bahasa pemrograman Erlang dan Go. Sesuai temuan saya, mereka masing-masing menggunakan model Aktor dan CSP.

Tetapi saya masih bingung dengan apa perbedaan obyektif antara CSP dan Aktor? Apakah hanya berbeda secara teoretis tetapi konsep yang sama?

nish1013
sumber
Yah mereka tidak sama karena Go menyediakan set primitif berbeda dari Erlang. Selain itu Go jauh lebih rendah daripada Erlang dan sejenisnya.
Daniel Gratzer
Pertanyaan tentang bahasa, teknologi, atau proyek apa yang harus diambil selanjutnya adalah off topic pada Programmer, karena mereka hanya dapat menarik opini subjektif untuk jawaban. Ada terlalu banyak faktor individu di balik pertanyaan untuk menciptakan jawaban yang akan memiliki nilai abadi. Bacaan yang disarankan: Gorilla vs Shark
gnat
3
@gnat Saya tidak setuju, ini menanyakan perbedaan obyektif antara CSP dan Aktor. Itu pertanyaan yang sangat masuk akal
Daniel Gratzer
2
Pertanyaannya bukan tentang baik atau buruk tetapi berbeda untuk ditentukan, dengan demikian pertanyaan ini konkret dan bukan penyebab perdebatan subyektif.
nish1013
1
Ada jawaban yang sangat bagus untuk pertanyaan ini di CS Theory StackExchange: Apa perbedaan antara Model Aktor Concurrency dan Berkomunikasi Proses Berurutan
Jörg W Mittag

Jawaban:

21

Dalam praktiknya, ada sedikit perbedaan: keduanya merupakan unit eksekusi yang terpisah yang antarmuka utamanya dengan dunia luar adalah melalui pesan.

Perbedaannya ada pada detail implementasi bahasa. Berikut beberapa detailnya:

  • Saluran di Go diketik; jika Anda ingin mengirim pesan dengan data berbeda, Anda perlu saluran terpisah. Dengan Erlang, seseorang receivemendapatkan semua yang dikirim ke proses dan harus mencocokkan pola (di Go, Anda akan menggunakan a selectdengan banyak kasus, sehingga kode akan terlihat sangat mirip, hanya dengan saluran yang berbeda).
  • Siapa pun dapat membaca atau menulis saluran Go. Di Erlang, siapa pun dapat mengirim ke suatu proses, tetapi hanya proses itu yang akan menerima. Ini menjadi penting jika Anda ingin membagi tugas antara beberapa pekerja: di Erlang Anda perlu membuat proses distribusi, sementara Go dapat dengan mudah berbagi saluran.
  • Erlang menyediakan (sebagian besar) jalur transparan untuk mendistribusikan proses pada banyak host / VM. Goroutine terbatas pada satu proses tunggal (walaupun ada perpustakaan untuk distribusi).
  • Penanganan kesalahan sangat berbeda. Erlang memperlakukan setiap proses sebagai independen: kesalahan dalam satu proses (katakan divide-by-0) tidak akan memengaruhi proses lain kecuali Anda secara eksplisit menautkannya (meskipun sesuatu menunggu pesan dari proses yang mati akan hang). Goroutine semuanya dijalankan dalam ruang proses yang sama; Divide-by-0 akan menghapus seluruh program.
  • Di Erlang, data tidak berubah. Ini berarti bahwa semua komunikasi antara suatu proses dan dunia luar terjadi melalui pesan. Go memungkinkan Anda untuk berbagi keadaan di antara goroutine (meskipun Anda seharusnya tidak).

Poin terakhir ini, saya pikir, yang paling penting. Sementara kedua pesan digunakan sebagai utama sarana komunikasi, Erlang membuat jaminan yang lebih kuat tentang bagaimana dan kapan negara bisa berubah.

kdgregory
sumber