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