Bagaimana Aktor bekerja dibandingkan dengan utas?

88

Adakah penjelasan yang baik dan singkat tentang bagaimana Aktor bekerja dibandingkan dengan utas?

Tidak bisakah utas dilihat sebagai aktor dan mengirim pesan ke utas lain? Saya melihat beberapa perbedaan, tapi tidak begitu jelas bagi saya. Bisakah saya menggunakan Aktor dalam bahasa apa pun dengan menggunakan utas berbeda?

Jonas
sumber

Jawaban:

78

Model aktor beroperasi pada penyampaian pesan. Proses individu (aktor) diizinkan untuk mengirim pesan secara tidak sinkron satu sama lain. Apa yang membedakan ini dari apa yang biasanya kita anggap sebagai model threading, adalah bahwa tidak ada (dalam teori) tidak ada keadaan bersama. Dan jika seseorang percaya (dapat dibenarkan, menurut saya) bahwa keadaan bersama adalah akar dari semua kejahatan, maka model aktor menjadi sangat menarik.

Namun, kita tidak boleh terlalu bersemangat. Model aktor tidak (bertentangan dengan beberapa tuduhan) membuatnya tidak mungkin mengalami kebuntuan. Model aktor juga tidak mencegah Anda dari perselisihan sumber daya antara proses yang berbeda - antrian pesan, misalnya. Model ini hanya "bebas kunci" di atas level tertentu. Di tingkat yang lebih rendah, untuk mengkoordinasikan antrian pesan, penguncian masih diperlukan.

Tidak bisakah utas dilihat sebagai aktor dan mengirim pesan ke utas lain?

Ya dan tidak. Tidak, jika Anda hanya menggunakan pendekatan menempatkan mutex di sekitar lokasi memori bersama. Kemudian utas berbagi status ini - keduanya memiliki akses ke memori ini, dapat membacanya, menulis ulang, dll. Tetapi Anda dapat membangun model aktor di atas model threading, dan memang semua implementasi aktor memiliki utas di bawah. Saya telah meretas sesuatu seperti ini (sangat buruk) dengan memberikan setiap utas antrian yang dijaga oleh mutex - hanya untuk bersenang-senang. Untuk mendapatkan gambaran tentang bagaimana impedansi benang-aktor dikelola, lihat pertanyaan saya dari setahun yang lalu .

Dapatkah saya menggunakan Model Aktor dalam bahasa apa pun dengan menggunakan utas secara berbeda?

Ya, tapi itu akan membutuhkan sedikit usaha. Bahasa favorit Anda mungkin memiliki perpustakaan penyampaian pesan, jadi itu akan menjadi hal pertama yang harus diselidiki. Selain itu, Anda harus menyelidiki penggunaan struktur data yang tidak dapat diubah. Perhatikan bahwa jika struktur data tidak dapat diubah, pada dasarnya Anda telah berurusan dengan masalah "status bersama" - beberapa utas dapat menyimpan referensi ke data yang tidak dapat diubah tanpa terjadi hal buruk. Ada alasan mengapa bahasa aktor cenderung juga menjadi bahasa fungsional (erlang, scala).

Anda mungkin juga ingin melihat Memori Transaksional Perangkat Lunak, yang merupakan model yang berbeda tetapi juga menarik. Clojure adalah contoh favorit saya tentang itu.

Rob Lachlan
sumber
3
Semakin saya menggunakan model konkurensi berbasis pesan asinkron (mis. Actor atau async / await), semakin saya pikir mereka hanyalah dual dari model konkurensi pemblokiran tersinkronisasi standar yang lama. Pengiriman pesan asinkron sebenarnya tidak lebih mudah atau lebih sulit daripada menggunakan kunci dan monitor. Memang, tidak ada keadaan yang bisa berubah bersama, tetapi hanya di tingkat aktor tunggal . Tetapi seorang aktor masih memiliki keadaan yang bisa berubah, dan itu sebenarnya dapat diamati oleh semua aktor yang bekerja sama dengannya. Oleh karena itu, Anda dapat memiliki semua masalah yang sama: jalan buntu, korban jiwa, kelaparan, kondisi balapan, dll.
Piotr Kołaczkowski
2

Saya tidak akan mengatakan bahwa aktor selalu menyampaikan pesan secara asinkron - itu akan terlalu lambat. Contohnya, proyek JActor menggunakan pesan 2 arah (permintaan / tanggapan) untuk membuat model panggilan metode dengan lebih baik. Dan sebagian besar permintaan dilayani secara sinkron.

JActor (pustaka Java) juga tidak menggunakan kunci. Hanya beberapa struktur data atom dan bersamaan, dengan beberapa semaphore yang dimasukkan. Pengiriman pesan adalah sekitar 0,8 Miliar pesan per detik.

https://github.com/laforge49/JActor

Bill la Forge
sumber
2
Model aktor ditentukan hanya dengan menggunakan komunikasi asinkron ( en.wikipedia.org/wiki/Actor_model ). Jika JActor tidak melakukan itu, maka itu bukan 100% hanya model aktor. Ini mungkin hanya menggunakan model aktor sebagai salah satu dari banyak fiturnya.
BT