Apakah uraian saya tentang model aktor itu benar?

13

Jika saya mengerti, model aktor seperti model objek, tetapi dengan beberapa perbedaan:

  1. SETIAP objek memunculkan thread tersendiri dan tidak masalah bahkan ketika Anda memiliki ribuan objek.
  2. Aktor tidak berinteraksi dengan memanggil fungsi dan mendapatkan nilai balik melainkan dengan mengirim dan menerima pesan.
  3. Jika Anda tidak melanggar model itu, aplikasi Anda akan menggunakan konkurensi dengan kekuatan penuh tanpa risiko kondisi balapan.
  4. 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?

WindScar
sumber
Aktor ringan atau agen mikro atau komponen aliran data tidak harus menggunakan utas mereka sendiri. :-) Periksa persyaratan berikut: pemrograman berbasis aktor, pemrograman berbasis agen, pemrograman berbasis dataflow. Mereka sangat mirip, tetapi mereka memiliki kendala yang berbeda. Ohh saya akan menanyakan ini sebagai pertanyaan ;-)
inf3rno

Jawaban:

12

Jawaban singkatnya adalah tidak, itu tidak benar.

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

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

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

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

Jerry Coffin
sumber
Tidak ada hubungan antara jumlah aktor dan jumlah utas; apa yang dijamin oleh model aktor adalah bahwa instance tertentu hanya akan dioperasikan oleh utas tunggal pada satu waktu, sehingga aktor Anda sudah aman-utas dan Anda tidak perlu menggunakan strategi sinkronisasi dan mengunci di dalamnya.
Rob Crawford
@RobCrawford: itulah satu (cukup sepele) cara untuk memastikan konsistensi data dalam model Aktor. Kertas Hewitt / Baker mencakup lebih banyak kemungkinan, seperti beberapa salinan Aktor yang berjalan di utas terpisah (hmm ... melihat jawaban saya, saya bertanya-tanya apakah saya jujur ​​tidak dapat mengingat nama Carl Hewitt pada saat itu, atau apakah menjadi ironis ketika saya menulisnya).
Jerry Coffin
Bukankah asinkronitas pesan yang melewati elemen penting dari model? Itu pasti akan mencegahnya menjadi isomorfik dengan panggilan fungsi virtual, yang bersifat sinkron. Atau perbedaan itu tidak relevan dari beberapa perspektif?
boycy
2

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.

kapal tunda
sumber
Mengenai # 1: Ya, "utas" dapat merujuk ke banyak hal. Utas OS biasanya cukup berat, benar, tetapi ada runtime bahasa yang secara internal menangani ratusan, ribuan, bahkan jutaan "utas" eksekusi dalam sejumlah kecil utas OS. Dalam beberapa implementasi, model-model tersebut tampaknya meningkatkan hingga puluhan core (saya telah melihat pernyataan bahwa versi GHC baru-baru ini bermain bagus dengan 32 core).