2012-10-07 2 views
0

스칼라 액터와 함께 일부 스케줄러 알고리즘을 구현하려고했습니다.스칼라 액터 - 수신 SingleThreadedScheduler 사용

스케줄러는 계산 중에 "상호 작용"기능을 호출하는 두 가지 기능을 수신합니다. 예를 들어 :

def func1(x:Int, y:Int)(scheduler:MyScheduler):Int = { 
    var z = 0 
    if (scheduler.interact(1)) { 
     return 7 
    } 
    z = x * y 
    for (c <- 1 to 10) { 
     if (scheduler.interact(z)) { 
      return z 
     } 
     z = z * c 
    } 
    z 
} 

이제 스케줄러는 순차적으로 두 기능을 실행해야하고, 함수의 실행이는 "상호 작용"에 도달 할 때마다, 스케줄러는 동일한 기능을 계속하거나 웨이크을 일시 중지할지 여부를 결정 다른 함수 계산을 늘리십시오.

언제든지 발전기의 () 번을 호출하는 스케줄러와 함께 파이썬 생성기를 실행하는 것과 같이 생각할 수 있습니다.

스칼라 액터를 사용하여이 기능을 구현했습니다. 각 함수는 액터에서 실행되고 interact 연산은 주 스레드 (스케줄러)에 일부 값을 응답하고 주 스레드의 메시지를 기다리는 "수신"을 호출합니다.

"수신"대신 "반응"을 사용할 수 없습니다. 수신 블록에서 벗어나서 (상호 작용 기능에서 돌아 오는) 실행이 필요하기 때문에 "수신"대신 "반응"을 사용할 수 없습니다.

그럼 내 액터가 항상 SingleThreadedScheduler을 사용하여 메인 스레드에서 실행되도록하여 구현을 향상시킬 수있을 것으로 생각했습니다.

그러나 "반응"과 달리 "수신"함수는 실행을 차단하는 새 스레드를 만들려고합니다.

"react"와 "receive"사이에 "receive"와 같이 블록을 그대로두고 "react"와 같은 새 스레드를 만들지 않는 항목이 있습니까? 아니면 다른 방법으로 스레드 수를 1로 제한 할 수 있습니까?

A-Posteriori 나는 스칼라 연속에 대해 읽었지만 너무 많은 코드 변경이 필요합니다 (그리고 스칼라 연속은 사용하기가 조금 복잡합니다 ...). 도전 이러한 종류의 액터 모델이 항상 옳은 추상화없는 증거가

감사

답변

0

입니다. 여러분이 말했듯이, 연속은 일반적으로 코드를 읽는 사람들에게 복잡한 것을 만들어 둡니다.

내 개인적인 취향은 스레드가 실제로 수행 할 작업을 명확히 추론 할 수있는 방법을 찾는 것입니다. 다행스럽게도이 기능은 우수한 JCSP API (UKC)를 사용하여 가능합니다. 이것은 Java API이지만 Scala에서도 잘 작동하며 성숙하고 안정적입니다 (Oxford Uni 순수 스칼라 프로젝트가 있지만 아직 성숙하지는 않음). JCSP는 Hoare의 CSP (수학적 대수)를 구현하지만 이벤트 구동이라는 것을 깨닫게되면 사용하기 쉽습니다. 액터는 JCSP에서 쉽게 모델링 될 수 있지만 그 반대는 아닙니다.

응용 프로그램에서 스케줄러는 자체 CS 프로세스 (Java 스레드라고도 함)를 가지며받은 이벤트에 따라 자체 상태와 수명주기를 결정합니다. 이를 통해 동시에 두 개의 함수를 순서대로 호출 할 수 있으며 동시에 겹치지 않고 더 많은 스레드 활동 세트에 속할 수 있습니다.

http://www.cs.kent.ac.uk/projects/ofa/jcsp/은 배경 자료를 제공합니다.항아리가 있습니다 http://mvnrepository.com/artifact/org.codehaus.jcsp/jcsp

+0

안녕하세요 릭, 의견을 말씀 드려 죄송합니다. jcsp 전용 온라인 포럼 또는 그룹이 있습니까? – user1125516

관련 문제