Engines
Engines (엔진)
타이머나 외부 트리거에 의해 선점(선제)될 수 있는 프로세스를 모델링하는 추상화인 엔진에 대해 알아봐요. 엔진을 사용하면 코드를 원하는 만큼만 실행시키고 중간에 멈추었다가 다시 이어서 진행할 수 있어요.
출처: Racket Reference
본문
11.6 Engines
(require racket/engine)
| package: base |
이 절에서 문서화한 바인딩은 racket/base나 racket이 아니라 racket/engine 라이브러리가 제공합니다.
엔진(engine)은 타이머나 다른 외부 트리거에 의해 선점될 수 있는 프로세스를 모델링하는 추상화예요. Haynes와 Friedman의 작업 [Haynes84]에서 영감을 받았습니다.
엔진은 'racket/engine이라는 이름의 로거(logger)를 통해 자신의 동작을 기록합니다. 그 로거는 모듈이 인스턴스화될 때 만들어지며, 부모로 (current-logger)의 결과를 사용합니다. 라이브러리는 'debug 수준 메시지를 기록하는데, engine-run이 호출될 때, 엔진 타임아웃이 만료될 때, 그리고 엔진이 멈춰질 때(종료됐거나 멈춰도 되는 안전 지점에 도달해서) 기록됩니다. 각 로그 메시지는 다음 struct의 값을 담습니다:
(struct engine-info (msec name) #:prefab)
여기서 msec 필드는 기록하는 순간의 (current-inexact-milliseconds) 결과를 담고, name 필드는 engine에 전달된 프로시저의 이름을 담아요.
(engine proc) → engine?proc : (any/c . -> . void?) . -> . any/c
허용될 때만 실행되는 스레드를 캡슐화하는 엔진 객체를 반환합니다. proc 프로시저는 인자를 하나 받아야 하고, engine-run이 호출되면 proc은 엔진 스레드에서 실행돼요. engine-run이 타임아웃 때문에 반환되면, 엔진 스레드는 이후의 engine-run 호출까지 일시 중단됩니다. 따라서 proc은 오직 engine-run 호출의 다이내믹 범위(dynamic extent) 동안에만 실행돼요.
proc의 인자는 불리언을 받는 프로시저로, 일시 중단을 비활성화하는 데 쓸 수 있어요(proc가 일시 중단되면 안 되는 임계 구역이 있을 때). 프로시저에 전달된 참(true) 값은 일시 중단을 허용하고, #f는 일시 중단을 비활성화합니다. 처음에는 일시 중단이 허용돼요.
(engine? v) → anyv : any/c
v가 engine이 만든 엔진이면 #t를, 그렇지 않으면 #f를 반환합니다.
(engine-run until engine) → boolean?until : (or/c evt? real?) engine : engine?
engine과 연관된 스레드가 until 밀리초 동안(until이 실수인 경우) 또는 until이 준비될 때까지(until이 이벤트인 경우) 실행되도록 허용합니다. 엔진의 프로시저가 일시 중단을 비활성화하면, 엔진은 일시 중단을 다시 허용할 때까지 임의로 오래 실행될 수 있어요.
engine-run은 엔진의 프로시저가 완료되면(또는 이전에 완료했었다면) #t를 반환하고, 그 결과는 engine-result로 얻을 수 있어요. 엔진의 프로시저가 일시 중단되기 전에 완료되지 않으면 engine-run은 #f를 반환합니다. 엔진의 프로시저가 예외를 일으키면 engine-run이 그 예외를 다시 일으켜요.
(engine-result engine) → anyengine : engine?
engine이 값으로(예외가 아닌) 완료되었다면 그 결과를, 그렇지 않으면 #f를 반환합니다.
(engine-kill engine) → void?engine : engine?
engine과 연관된 스레드가 아직 실행 중이라면 강제로 종료하고, 엔진 결과는 바꾸지 않습니다.