Dato un problema di concorrenza, che cosa cercheresti per decidere se utilizzare o meno gli attori?
Per prima cosa vorrei cercare di definire il problema ... la motivazione principale è l'accelerazione di un ciclo annidato o ricorsione? Se è così, un approccio basato su un semplice compito o un ciclo in parallelo probabilmente funzionerà bene per voi (piuttosto che per gli attori).
Tuttavia, se si dispone di un sistema più complesso che coinvolge dipendenze e che coordinano lo stato condiviso, un approccio attore può essere d'aiuto. In particolare, attraverso l'uso di attori e la semantica del messaggio, è spesso possibile evitare l'uso di blocchi espliciti per proteggere lo stato condiviso realizzando effettivamente copie di quello stato (messaggi) e reagendo a tali stati.
Si può fare abbastanza facilmente con i classici problemi di sincronizzazione come i filosofi del pranzo e il problema dei barbieri addormentati. Ma puoi anche usare l''attore' per aiutare con schemi più moderni, cioè la tua facciata potrebbe essere un attore, la tua vista modello e il controller potrebbero anche essere attori che comunicano tra loro.
Un'altra cosa che ho osservato è che la semantica degli attori è apprendibile dalla maggior parte degli sviluppatori e "più sicura" rispetto alle controparti bloccate. Questo perché innalzano il livello di astrazione e consentono di concentrarsi sul coordinamento dell'accesso a tali dati anziché proteggere tutti gli accessi ai dati con i blocchi. Ad esempio, immagina di avere una classe semplice con un membro dati. Se si sceglie di inserire un blocco in tale classe per proteggere l'accesso a tale membro dati, qualsiasi metodo su quella classe dovrà garantire che acceda a quel membro dati sotto il blocco. Questo diventa particolarmente problematico quando altri (o voi) modificano la classe in un secondo momento, devono ricordare per utilizzare quel blocco.
D'altra parte se quella classe diventa un attore e il membro dati diventa un buffer o una porta con cui comunichi tramite messaggi, non devi ricordarti di prendere il blocco perché la semantica è incorporata nel buffer e tu saprai in modo esplicito se stai andando a bloccarlo in base al tipo di buffer.
-Rick
Per aggiungere al vostro punto, uno dei vantaggi della programmazione orientata agli oggetti è l'incapsulamento di dati e funzioni correlate. Tuttavia, è ancora necessario "dare la vita" a un oggetto chiamando uno dei suoi metodi. Abbiamo una visione separata di oggetti e processi lì. Gli attori d'altra parte sono processi a pieno titolo. Questo rende facile relazionarli nel mondo reale. – tilish