2011-06-11 2 views

답변

9

eventlooploopreact과 결합하여 작동합니다. loopeventloop의 차이점은 실제로 loop은 본문을 재귀 적으로 호출하지 않고 (스레드 기반 액터의 스택 오버플로를 방지하기 위해) 사서함에서 다음 메시지를 처리 ​​(응답/수신)하도록 예약하고 완료합니다 호출 스택을 정리하기 위해 예외를 던지는 현재 처리기를 실행합니다.

eventloop 재귀 react 사용하여 메시지를 처리 ​​- react의 경우에 react의 몸 (!하지만 receive)는 항상 대부분의 경우, 예외로 끝나는 있기 때문에, (그리고 스택 오버 플로워하지 않음) 안전, 및 다음 루프를 스케쥴링하여 모든 액터의 스레드 풀 양식에 대한 공정한 액세스를 보장합니다. 따라서 eventloop은 이벤트 중심 액터에서만 사용할 수 있습니다.

import scala.actors._ 
import Actor._ 

class EventLoop extends Actor { 
    def act = eventloop{ 
     case msg => println("Received " + msg) 
    } 
} 
3

어쩌면 this thread 몇 가지 세부 사항 제공 할 수 있습니다 : 배우에 대한

하나의 중요한 동기는 그들이 당신 이 최대 하나의 스레드 한 번에 배우 내부에서 실행 있다는 것을 의미 제어 반전을 방지 할 수 있다는 것입니다, 그리고를 사용자는 일 때 제어 흐름의 명시적인 지점에서 메시지를 기다리는 직선 프로그램을 작성하여 처리 할시기를 선택합니다.

이 모델에서는 대개 콜백 함수를 비동기 적으로 호출하는 다른 스레드로 전달하지 않으려합니다. 대신 다른 스레드는 메시지를 보내어 액터와 상호 작용해야합니다. 콜백 같은 행동이 다음 원하는 경우 는 다음과 같은 패턴은 스레드 안전한 방법에서 달성 :

def eventloop() { 
    react { 
     case Event1 => 
     // handle Event1 
     eventloop() 
     ... 
     case Eventn => 
     // handle Eventn 
     eventloop() 
    } } 

이 패턴은 Actor.eventloop에서 추상 작업으로 제공됩니다

import scala.actors.Actor._ 

    eventloop { 
    case Event1 => 
     // handle Event1 
    case Eventn => 
     // handle Eventn 
    } 

일부 func에 대한 꼬리 호출이 필요 없음을 유의하십시오 더 이상.


2008에서 스레드 날짜를 고려했다되고, 그리고 Scala Actor API guide 어쩌면이가 자주 사용하지 않는, 한 번 eventloop을 언급하지 않습니다.
Vasil Remeniuk 전문적으로 eventloophis answer (+1)으로 사용하고 " Client-Server example with Scala actors"이라는 질문에 구체적인 예를 제공합니다.