스칼라 액터와 함께 일부 스케줄러 알고리즘을 구현하려고했습니다.스칼라 액터 - 수신 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 나는 스칼라 연속에 대해 읽었지만 너무 많은 코드 변경이 필요합니다 (그리고 스칼라 연속은 사용하기가 조금 복잡합니다 ...). 도전 이러한 종류의 액터 모델이 항상 옳은 추상화없는 증거가
감사
안녕하세요 릭, 의견을 말씀 드려 죄송합니다. jcsp 전용 온라인 포럼 또는 그룹이 있습니까? – user1125516