Java 동시성에서 Scala 동시성으로 마이그레이션
-
11-09-2019 - |
문제
문제를 해결하기위한 Java에서 상당히 표준 메커니즘이 있습니다.
- 작업 항목은 특정 시간에 실행해야합니다.
- 그런 다음 각 작업 항목은 조건이 사실이되기를 기다려야합니다.
- 작업 품목은 취소 할 수 있어야합니다
내가 사용하는 솔루션은 다음과 같습니다.
- 작업 항목을 예약 할 수있는 단일 스레드 스케줄러가 있어야합니다
- 가지고있다
ExecutorService
(멀티 스레드 일 수 있음) - 각 예정된 작업 품목은 실제 작업을 다음에 제출합니다.
ExecutorService
. 반환Future
지도에 캐시됩니다. 작업이 완료되면 캐시에서 미래를 제거하는 데 완료 서비스가 사용됩니다. - 캐시 된 선물을 통해 항목을 취소 할 수 있습니다
물론, 내 집행 인은 내가 기대할 것으로 예상되는 차단 작업 품목의 수만큼 커야하지만 실제로는 문제가되지 않습니다.
이제 스칼라로 코딩하고 배우 프레임 워크를 사용하고 있습니다. 내 작업 항목이 배우에게 전송 된 이벤트에서 캡슐화 될 수 있다고 가정합니다.
- 특정 시간 동안 작업 항목을 예약하는 데 어떤 메커니즘을 사용하겠습니까?
- 작업 항목이 액터에게 전송 된 이벤트 인 경우, 백킹 스레드 풀이 동시에 차단할 수있는 품목 수보다 더 큰지 확인하려면 어떻게해야합니까?
- 이전에 예정된 작업 품목을 취소하려면 어떻게해야합니까?
해결책
특정 시간 동안 작업 항목을 예약하는 데 어떤 메커니즘을 사용하겠습니까?
java.util.concurrent.scheduledExecutorService를 사용합니다.
작업 항목이 액터에게 전송 된 이벤트 인 경우, 백킹 스레드 풀이 동시에 차단할 수있는 품목 수보다 더 큰지 확인하려면 어떻게해야합니까?
이것은 평행의 노력을 물리 치는 디자인으로 나를 놀라게합니다. 차단 및 글로벌 상태를 최소화하거나 제거하십시오. 이것들은 종합성과 확장성에 대한 장벽입니다. 예를 들어, 파일이 도착하기를 기다린 다음 행위자에게 이벤트를 시작하는 단일 전용 스레드를 고려하십시오. 또는 비동기 비 블로킹 I/O에 대한 java.nio를보십시오.
여기서 귀하의 요구 사항을 완전히 이해하지 못하지만 I/O 이벤트를 찾는 단일 스레드/액터가있을 수 있습니다. 그런 다음 예정된 "작업 항목"으로 비 블로킹 액터를 만드는 일정을 예약하십시오. 해당 액터가 I/O 스레드/액터에 등록하여 관심있는 I/O 이벤트에 대한 메시지를 받도록하십시오.
이전에 예정된 작업 품목을 취소하려면 어떻게해야합니까?
ScheduledExecutorService
미래를 반환합니다. 당신이 가진 것은 그 점에서 나쁜 디자인이 아닙니다. 지도에서 수집하고 Future.Cancel ()을 호출하십시오.
다른 팁
예정된 배우 목록이있는 스케줄링 배우가있을 수 있으며 actor.receivewithin () 매 초마다 일어나서 실행 준비가 된 배우에게 메시지를 보냅니다. 스케줄링 배우도 취소를 처리 할 수도 있습니다. 또 다른 옵션은 모든 액터가 일정을 중앙 집중화하는 대신 수신자 ()로 자체 일정을 직접 처리하도록하는 것입니다.
블로그 게시물 에이 문제에 대한 논의가 있습니다. 스칼라의 스케줄러와 같은 간단한 크론.