2013-03-24 3 views
2

Предположим, у меня есть три Актера, которые общаются друг с другом: ActorControl, ActorA, ActorB.Аккулярный вопрос акковских актеров

ActorA и ActorB общаются с ActorControl. Сообщения, которые они получают, в основном разные, но у них также одно сообщение X. Когда они получают X, им нужно выполнить функцию Y.

Чтобы избежать дублирования кода, я вынул функцию Y для объекта пакета, называемого общим.

В этом случае может случиться так, что как ActorA, так и ActorB называют common.Y в одно и то же время.

Мой вопрос заключается в том, что я саботирую актерский параллелизм?

ответ

4

Вы можете обмениваться кодами между участниками, но вы не можете обмениваться данными. Если ваши функции чистые (без гражданства и без побочных эффектов), тогда проблем нет.

Вот некоторые примеры:

object Helper { 

    // Safe 
    def incrementPure(total: Int, i: Int) = total + i 

    //Unsafe 
    private var total = 0 
    def incrementStateful(i: Int) = { total += i; total } 

    //Unsafe 
    def incrementSideEffect(i: Int) = { 
    val total = readCurrentTotal() 
    val total2 = total + i 
    saveCurrentTotal(total2) 
    total2 
    } 

} 

В последних двух функций, вы должны обеспечить своего рода синхронизацию. Однако это может повлиять на производительность, если вы полагаетесь на параллелизм.

+1

Если они не были чистыми, было ли различие, если я использую две функции с одним и тем же кодом или если я использую одну «общую» функцию? – 2013-03-24 10:18:52

+1

@tzofia Да, у вас могут быть проблемы, если они не чисты, но есть несколько возможных исправлений. Если вы предоставите дополнительную информацию, я (или кто-то другой) может предоставить решение вашей проблемы. – paradigmatic

+0

Можете ли вы привести пример для случая, что будет разница между использованием одной функции или двух равных функций (когда функция не чиста ..)? Я не могу понять, почему будет иначе ... – 2013-03-24 10:25:09

Смежные вопросы