
Concurrent ML(CML)은 채널 통신을 실행문이 아니라 나중에 실행할 수 있는 값으로 표현한다. 글쓴이는 이 방식이 Go의 select보다 선택과 취소를 조합하고 감싸기 쉽다고 설명하며, Racket의 이벤트 시스템을 예제로 소개한다.
Go의 채널 전송·수신은 실행 지점에 도달하면 바로 작동한다. select 안에서는 여러 채널 작업 중 준비된 하나를 고를 수 있지만, 이 작업 설명을 select 밖으로 꺼내 함수에서 반환하거나 자료구조에 담을 수는 없다. 반면 Racket에서는 통신 작업을 이벤트 값으로 만들고, sync를 호출할 때 실제로 실행한다. 이벤트를 변수에 담고 함수에서 반환하거나 다른 이벤트와 조합할 수 있다.
이벤트 조합자는 작업에 설정이나 완료 후 동작을 붙이고, 여러 이벤트 중 하나를 선택하는 기능을 제공한다. 글의 예제에서는 두 URL에서 먼저 도착한 응답을 택하는 이벤트에 시간 제한을 결합한다. 또한 guard-evt로 작업을 실행하기 전 설정을 처리하고, nack-guard-evt로 선택되지 않았거나 대기 중 취소된 작업을 감지한다. 이를 이용하면 인쇄 요청이 서비스에 전달되기 전에 취소되거나, 응답을 기다리는 쪽이 더 이상 결과를 받지 않는 경우를 처리할 수 있다.
글쓴이는 또 Racket에서 이벤트에만 대기하고 해당 스레드와 이벤트를 참조하는 살아 있는 참조가 없으면 스레드가 가비지 수집 대상이 될 수 있다고 설명한다. Go에서는 종료되지 않은 고루틴이 메모리와 참조 중인 값을 계속 붙잡을 수 있어 누수 원인이 된다고 지적한다. 이는 CML과 Racket의 동작에 관한 설명이며, 글은 새 동시성 모델을 제안하기보다 Go의 채널·select에 익숙한 독자에게 기존 모델을 소개하는 데 목적을 둔다.
Racket 예제를 따라 해보려면 Racket을 내려받고 DrRacket에서 코드 조각을 붙여 넣어 실행하면 된다. 글은 Go 문법과 채널 동작에 대한 기본 지식을 전제로 하며, Racket을 몰라도 함수 호출과 재귀의 기초를 알면 핵심 내용을 따라갈 수 있다고 설명한다. 원문에는 CML과 Go의 비교 및 관련 자료가 실려 있다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요