Jika saya mengerti, model aktor seperti model objek, tetapi dengan beberapa perbedaan:
- SETIAP objek memunculkan thread tersendiri dan tidak masalah bahkan ketika Anda memiliki ribuan objek.
- Aktor tidak berinteraksi dengan memanggil fungsi dan mendapatkan nilai balik melainkan dengan mengirim dan menerima pesan.
- Jika Anda tidak melanggar model itu, aplikasi Anda akan menggunakan konkurensi dengan kekuatan penuh tanpa risiko kondisi balapan.
- Semua yang dapat Anda lakukan di OO dapat Anda lakukan dengan menggunakan aktor tetapi lebih baik, masalahnya adalah bahwa semua yang kami kodekan pada tahun-tahun terakhir berbasis OO - tetapi transisi akan segera terjadi.
Jadi misalnya, misalkan saya harus mendefinisikan kelas / aktor vektor 3d, buat dua contoh dan panggil operasi penjumlahan pada mereka.
BERORIENTASI PADA OBJEK:
class V3d {
constructor V3d(x,y,z) //bla
float x,y,z;
function sum(V3d b)
{
return V3d(x+b.x,y+b.y,z+b.z);
}
}
//using:
mySum = V3d(1,2,3).sum(V3d(3,2,1)) //creates 2 instances, sum, returns instantly
drawPoint(mySum) //uses the result
MODEL AKTOR:
actor V3d
{
constructor V3d(x,y,z) //bla
float x,y,z;
loop
{
receive 'sum',b:V3d :
send(caller,'sumResult',V3d(x+b.x,y+b.y,z+b.z))
}
}
//using:
send(V3d(1,2,3),'sum',V3d(3,2,1)) //creates 2 instances, send to the first one a request to sum with the second one
loop
{
receive 'sumResult',result:
drawPoint(result) //receives result and draws it
}
Itu saja? Atau saya benar-benar salah?
Jawaban:
Jawaban singkatnya adalah tidak, itu tidak benar.
dimulai dengan benar (setiap Aktor setidaknya berpotensi dieksekusi sebagai utas independen), tetapi kemudian sebagian besar mati. Tidak ada apa-apa tentang model yang membuat banyak utas bekerja dengan baik - itu terserah implementasi. Paling-paling, kemudahan membuat banyak utas memberi tekanan pada implementasi untuk menyediakan threading yang efisien. Setidaknya sejauh model peduli, kemiripan antara aktor dan objek sebagian besar kebetulan. "Objek" membawa implikasi yang cukup spesifik tentang bagaimana Anda menggabungkan kode dan data. Seorang aktor umumnya akan melibatkan kedua kode dan data, tetapi menyiratkan sedikit tentang bagaimana mereka digabungkan (selain fakta bahwa satu-satunya data yang terlihat oleh dunia luar adalah pesan).
Cara yang biasa menggambarkan interaksi adalah sebagai pengiriman pesan, ya. Saya tidak memiliki kutipan yang berguna, tetapi seseorang telah membuktikan beberapa waktu yang lalu bahwa mekanisme seperti C ++ fungsi virtual isomorfik untuk pengiriman pesan (karena fungsi virtual biasanya diterapkan, Anda menggunakan offset ke dalam vtable - tetapi jika Anda mengirim offset ke dalam tabel pesan sebagai gantinya, efeknya akan sama).
Tidak sesederhana itu. Jika Anda dapat menemukan salinannya, Henry Baker (dengan orang lain yang namanya tidak saya ingat sekarang) menulis makalah tentang aturan yang diperlukan untuk konsistensi data dalam model Aktor.
"Lebih baik" sangat subyektif. Beberapa masalah sifatnya sangat paralel, dan benar-benar melibatkan sejumlah besar entitas yang pada dasarnya otonom, dengan interaksi minimal yang terutama tidak sinkron. Ketika itu terjadi, model aktor dapat bekerja dengan sangat baik. Untuk masalah lain, itu tidak benar. Beberapa masalah hampir seluruhnya bersifat serial. Yang lain dapat dieksekusi secara paralel, tetapi masih memerlukan sinkronisasi dekat antara tindakan tersebut (misalnya, pada dasarnya mode seperti SIMD, di mana Anda mengeksekusi satu instruksi pada suatu waktu, tetapi setiap instruksi bertindak pada sejumlah besar item data). Tentu saja mungkin untuk menyelesaikan kedua jenis masalah ini dengan menggunakan model aktor - tetapi untuk masalah seperti itu, seringkali melibatkan sejumlah besar pekerjaan ekstra untuk sedikit atau tanpa hasil sebagai imbalan.
sumber
Mengenai 1: Saya telah bekerja dengan aplikasi berurutan Actor-modeled tunggal (ish), jadi sangat mungkin untuk mengabaikan nomor utas besar yang disarankan ini. AFAIK, utas bukan benda ringan dengan cara apa pun, jadi mungkin tidak diinginkan memiliki satu untuk setiap aktor, tergantung pada berapa banyak aktor yang Anda gunakan.
Mengenai 3: Saya cukup yakin kondisi balapan dapat terjadi dalam sistem model aktor hanya karena logika pemrograman?
Mengenai 4: Tentukan 'lebih baik'? Pengalaman saya adalah bahwa logika asinkron bisa jauh lebih sulit dibaca daripada hal-hal yang sinkron. misalnya, dalam contoh Anda di atas, Anda tidak tahu operasi mana yang bertanggung jawab untuk hasil mana, jadi ada pelacakan pesan tambahan yang harus dilakukan. Setelah itu ditambahkan dan pesan masuk dan keluar lainnya dimasukkan dalam logika, maksud kode tersebar di beberapa fungsi kirim / terima.
Setelah mengatakan semua itu, saya penggemar berat model aktor yang digunakan untuk lapisan atas aplikasi. Ini dapat membuat decoupling lebih mudah, karena menambahkan dependensi sedikit lebih sulit daripada menambahkan fungsi. Saya juga tidak memiliki banyak pengalaman dengan tingkat yang lebih tinggi daripada bahasa Jawa, dan paradigma lain mungkin mendukung asinkron-ness dengan cara yang lebih mendasar.
sumber