Есть ли какие-либо руководства или учебные пособия, которые объясняют возможность использования scala актеров удаленно? Все, что я нашел до сих пор, является одним из примеров (без комментариев), но этого недостаточно.
Scala удаленные участники
Ответ 1
Я написал статью с примером приложения, чтобы объяснить использование удаленных исполнителей некоторое время назад.
Ну, у него нет комментариев внутри кода (возможно, вы даже имели в виду эту статью), но есть пояснения ниже кода.
Ответ 2
Просто будьте осторожны, чтобы отправлять сообщения, которые являются сериализуемыми (классы case и case-объекты!), и убедитесь, что противоположная сторона может создать класс. Остерегайтесь пользовательских ClassLoaders или отсутствующих JAR-пакетов в ваших классах.
Ответ 3
Ничто из этого я не знаю. Это в значительной степени "взломать ваш путь через джунгли". Судя по API, все должно работать примерно так же, как и обычные участники, для которых существует один или два учебника (а также несколько книг).
Если вы используете удаленных участников, мы (сообщество) обязательно приветствуем такой урок от опытного пользователя!
Ответ 4
В структуре Akka есть удаленные участники. API довольно похож на обычных участников scala.
Они также обеспечивают некоторый уровень автоматической кластеризации, но не завершены.
Ответ 5
недавно на главной странице www.scala-lang.org было добавлено руководство, вот ссылка http://www.scala-lang.org/docu/files/actors-api/actors_api_guide.html#
Ответ 6
Возможно, это некрополь, но я искал все и не мог найти много. Надеюсь, это поможет кому-то.
Я запускаю Mac OS 10.6.8 и Scala 2.9.0.1. У меня были проблемы с запуском канонических удаленных исполнителей. Я получил следующий код.
Примечание. Метод clear предназначен только для предотвращения наложения сообщений. Это не критично для примера. Аналогично вызовы Thread.sleep - это просто, чтобы было легче увидеть, что происходит во время выполнения.
Скомпилируйте его, затем в отдельных экземплярах оболочки выполните:
$> scala Ping
и
$> scala Pong
в любом порядке. Вы можете экспериментировать, убивая одного из них за раз и отслеживая код.
import scala.actors._
import scala.actors.Actor._
import scala.actors.remote._
import scala.actors.remote.RemoteActor._
/** @author Connor Doyle */
// Remote messages must be serializable.
// The easist way to do this is to wrap
// them with a case class
case class Message(text: String)
abstract class PingPongActor extends Actor with App {
val pingPort = 9000
val pongPort = 9001
val delay = 1000
classLoader = getClass().getClassLoader() // hack!
start
// this method consumes all pending messages
// the library should have implemented an atomic
// receiveAndClear operation
def clear: Unit = receiveWithin(0) {
case TIMEOUT => ()
case _ => clear
}
}
object Ping extends PingPongActor {
// result of select already lazy, but explicit lazy conveys
// semantics clearly
lazy val pong = select(Node("localhost", pongPort), 'pong)
def act = {
alive(pingPort)
register('ping, self)
loop {
pong ! Message("ping")
receiveWithin(delay * 2) {
case Message(text: String) => {
clear
println("received: "+text)
Thread.sleep(delay) // wait a while
}
case TIMEOUT => println("ping: timed out!")
}
}
}
}
object Pong extends PingPongActor {
lazy val ping = select(Node("localhost", pingPort), 'ping)
def act = {
alive(pongPort)
register('pong, self)
loop {
receiveWithin(delay * 2) {
case Message(text: String) => {
println("received: "+text)
Thread.sleep(delay) // wait a while
clear
ping ! Message("pong")
}
case TIMEOUT => println("pong: timed out")
}
}
}
}
Ура!