플러머
플러머 (Plumbers)
플러머(plumber)는 플러시 콜백(flush callback)을 지원하는 메커니즘이에요. 플러시 콜백은 보통 Racket 프로세스나 place가 종료되기 직전에 트리거돼요. 예를 들어 출력 포트의 버퍼를 비우는 동작 같은 걸 플러시 콜백으로 등록해 둘 수 있죠. 이 절에서는 플러머를 만들고 콜백을 등록·해제하는 방법을 살펴볼게요.
출처: Racket Reference
본문
플러머는 플러시 콜백을 지원하는데, 플러시 콜백은 보통 Racket 프로세스나 place가 종료되기 직전에 트리거돼요. 예를 들어 플러시 콜백은 출력 포트의 버퍼를 비울 수 있어요.
플러시 콜백은 표준 C 라이브러리의 atexit과 대략 비슷하지만, 플러시 콜백은 그와 비슷한 다른 시나리오에서도 사용할 수 있어요.
프로세스가 종료되기 전에 플러시 콜백이 호출된다는 보장은 없어요. 그 이유는 플러머가 기본 종료 핸들러에 의해 플러시되는 원래 플러머가 아닐 수 있기 때문이거나, 프로세스가 강제로 종료되기(예: custodian 종료) 때문이에요.
procedure
(plumber? v) → boolean?
v : any/c
v가 플러머 값이면 #t를, 그렇지 않으면 #f를 돌려줘요.
base 패키지의 6.0.1.8 버전에서 추가됐어요.
procedure
(make-plumber) → plumber?
새 플러머를 만들어요.
플러머는 (custodian이나 inspector와 달리) 계층 구조가 없지만, 한 플러머에 등록된 플러시 콜백이 다른 플러머로 plumber-flush-all을 호출할 수는 있어요.
base 패키지의 6.0.1.8 버전에서 추가됐어요.
parameter
(current-plumber) → plumber?
(current-plumber plumber) → void?
plumber : plumber?
플러시 콜백을 위한 현재 플러머를 결정하는 파라미터예요. 예를 들어 출력 파일 스트림 포트를 만들면, 포트가 열려 있는 동안 포트를 플러시하도록 현재 플러머에 플러시 콜백이 등록돼요.
base 패키지의 6.0.1.8 버전에서 추가됐어요.
procedure
(plumber-flush-all plumber) → void?
plumber : plumber?
plumber에 등록된 모든 플러시 콜백을 호출해요.
호출할 플러시 콜백은 첫 번째 콜백이 호출되기 전에 plumber에서 수집돼요. 플러시 콜백이 새 플러시 콜백을 등록하면 그 새 콜백은 호출되지 않아요. 플러시 콜백이 예외를 발생시키거나 달리 탈출하면, 나머지 플러시 콜백은 호출되지 않아요.
base 패키지의 6.0.1.8 버전에서 추가됐어요.
procedure
(plumber-flush-handle? v) → boolean?
v : any/c
v가 플러시 콜백 등록을 나타내는 플러시 핸들이면 #t를, 그렇지 않으면 #f를 돌려줘요.
base 패키지의 6.0.1.8 버전에서 추가됐어요.
procedure
(plumber-add-flush! plumber proc [weak?]) → plumber-flush-handle?
plumber : plumber?
proc : (plumber-flush-handle? . -> . any)
weak? : any/c = #f
proc를 plumber에 플러시 콜백으로 등록해서, plumber에 plumber-flush-all을 적용하면 proc이 호출되도록 해요.
결과 플러시 핸들은 콜백의 등록을 나타내며, plumber-flush-handle-remove!로 콜백을 등록 해제하는 데 사용할 수 있어요.
주어진 proc은 플러시 핸들에서 도달할 수 있지만, weak?가 #t면 플러머는 결과 플러시 핸들(따라서 proc)에 대해 약한 참조만 유지해요.
proc이 플러시 콜백으로 호출될 때, proc이 스스로 등록을 해제하기 편하도록 plumber-add-flush!가 돌려준 것과 같은 값이 전달돼요. proc의 호출은 연속 배리어(continuation barrier) 안에서 이뤄져요.
base 패키지의 6.0.1.8 버전에서 추가됐어요.
procedure
(plumber-flush-handle-remove! handle) → void?
handle : plumber-flush-handle?
handle을 만들어낸 plumber-add-flush! 호출로 등록됐던 플러시 콜백을 등록 해제해요.
handle이 나타내는 등록이 이미 제거됐다면 plumber-flush-handle-remove!는 아무 효과가 없어요.
base 패키지의 6.0.1.8 버전에서 추가됐어요.
더 알아보기
- Performance Hints — 성능 관련 힌트.