버퍼 채널이 제한하는 건 채널 안에 들어간 작업 수예요. 보내려고 막혀 있는 고루틴 수는 제한하지 않아요.
서버에 요청 100개가 한꺼번에 몰린다고 해 볼게요. 요청마다 작업이 하나씩이고, 워커는 넷, 채널 버퍼는 여덟 칸이에요. 몰리는 동안 끝나는 작업은 없어요. 넷은 실행 중이고 여덟은 버퍼에 있어요. 요청마다 이미 송신용 고루틴을 띄웠다면 나머지 88개는 송신에서 멈춰 있어요. 큐에는 한도가 있어요. 큐 앞에 줄 선 고루틴에는 없어요.
송신을 또 다른 고루틴으로 옮겨도 기다리는 위치만 바뀌어요. 버퍼 없는 채널은 송신자와 수신자를 교환 시점에 만나게 할 뿐이고, 송신자가 몇이나 몰려오는지는 막지 못해요.
수용 판단은 요청 진입점에서 해요. 작업을 띄우기 전에 자리부터 잡고, 자리가 없으면 그 자리에서 포화 응답을 돌려줘요. 수용 단계가 대신 기다리게 한다면 그 대기에도 인원 상한과 마감 시간이 있어야 해요. 아니면 큐가 앞쪽으로 옮겨 갔을 뿐이에요.
호출자가 떠나면 핸들러가 취소 신호를 보내고, 워커는 대기 중인 작업을 시작하기 전과 적당한 중단 지점에서 그 신호를 확인해요. 그런데 신호가 자리를 비워 주지는 않아요. 작업이 제한 대상 자원을 실제로 놓을 때까지는 계속 한 자리로 세요.
작은 작업 열두 개로 정해진 배치라면 고루틴 열두 개를 그냥 바로 띄울래요. 입력 개수가 정해져 있으면 풀까지 둘 필요는 없겠네요.