Как вызвать двух актеров одновременно, то есть параллельно? - PullRequest
0 голосов
/ 04 июля 2019

У меня есть сценарий, в котором две функции работают параллельно.

Ниже приведен пример псевдокода.

MainActor{
 // retrive company ids
 //for each company id i need to run another two different actions simultaniously 
   tell(A_Actor)
   tell(B_Actor)
//if I call above they are calling sequentially i.e. first it runs tell(A_Actor)
//then comes to tell(B_Actor).
//If tell(A_Actor) fails it wont run tell(B_Actor).
}
A_Actor{
// do ingest into a file.
}

B_Actor{
// do ingest into a DB.
}

Вопрос: Как запустить две функции, то есть сказать (A_Actor) и скажите (B_Actor) параллельно?

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Метод tell является асинхронным.Когда вы запускаете от tell до actorA, он не ждет, пока actorA не завершится или не завершится аварийно, чтобы выполнить следующее действие, которое здесь tell actorB

Если вам нужно парализовать дваtell методов, тогда вы можете сделать следующее:

    val tellActions = Vector(() => actorA.tell(messageA, senderActor), () => actorB.tell(messageB, senderActor))
    tellActions.par.foreach(_.apply())

Обратите внимание, что это код Scala

0 голосов
/ 06 июля 2019

На это было указано в нескольких комментариях (включая мой), но я чувствовал, что заслуживает ответа.

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

Код, который вы показываете , будет выполнять захват в файле и принимать егов БД параллельно.Это автоматически и не требует никаких действий с вашей стороны;так действуют актеры и tell.И, несмотря на то, что вы говорите, если что-то пойдет не так с загрузкой файла, это не повлияет на загрузку в БД.(Предполагая, что вы правильно создали акторов и сообщения, поскольку вы не перечислили их реализацию.)

Метод tell является асинхронным: он почти сразу же возвращается и не выполняет фактическую логику (в этом случаеcase): единственное, что он делает - это помещает сообщение в почтовый ящик получателя.Теоретически ответ Исмаила показывает вам, как вы могли бы «вызывать tell» параллельно, но в этом примере вы «последовательно» создаете массив, который используется для параллельных сообщений, и весь процесс будет очень неэффективно.) Его код, хотя технически и выполняет то, что вы просите, на практике бессмысленен: он ничего не дает, кроме значительного замедления кода.

Короче говоря, я думаю, вы тоже:

  • Что-то в корне не так с вашими актерами и тем, как вы их называете.
  • На самом деле вы выполняете функции параллельно, и вы просто не понимаете этого, потому что измеряете / наблюдаете что-то неправильно.
...