openlang

deep 핸들러에서 함수를 continuation으로 바꾸기

문서의 deep 핸들러 예제에는 이런 문단이 있어요:

계산 f 자체도 효과를 수행할 수 있습니다. f가 Yield를 수행하면 현재 작업을 멈추고 실행 가능한 작업 큐에 넣은 뒤, 스케줄러가 다음 작업을 실행합니다. 효과가 Fork f라면 현재 작업을 멈추고 spawn f를 꼬리 호출해 새 작업 f를 곧바로 실행합니다. 새 작업을 먼저 실행하기로 한 건 임의의 선택이라는 점을 보세요. 다른 선택으로는 f의 작업을 준비 큐에 넣고 k를 즉시 재개할 수도 있습니다.

제가 뭔가 간단한 걸 놓쳤을 수도 있지만, 이 스케줄러 예제를 보면요:

type _ Effect.t += Fork : (unit -> unit) -> unit t
                 | Yield : unit t

(* Round-robin scheduling with concurrency *)
let run (entry : unit -> unit) : unit =
  let pending : (int * (int, unit) continuation) option ref =
    ref None (* exchanger awaiting a partner *)
  in
  let ready = Queue.create () in (* ready-task queue *)
  let schedule cont arg =
    let resume () = continue cont arg in
    Queue.push
      resume ready
  in
  let next () =
    if Queue.is_empty ready then () (* finished *)
    else begin
      let resume = Queue.pop ready in
      resume ()
    end
  in
  let rec start (work : unit -> unit) : unit =
    match work () with
    | () -> next ()
    | exception err ->
        print_endline (Printexc.to_string err);
        next ()
    | effect Yield, cont -> schedule cont (); next ()
    (* How can work be queued at this point? *)
    | effect (Fork work), cont -> schedule cont (); start work
    | effect (Xchg value), cont ->
        begin match !pending with
        | Some (other, saved) -> pending := None; schedule saved value; continue cont other
        | None -> pending := Some (value, cont); next ()
        end
  in
  start entry

work를 ready에 어떻게 넣나요?

영어에서 번역원문 보기

이어지는 대화 3

서로의 근거를 따라
  1. 고유 링크

    schedule 도우미를 거치지 않고 ready를 직접 다루면 될 것 같아요.

    다음 코드 대신

        | effect (Fork work), cont -> schedule cont (); start work

    순서를 바꿔 이렇게 하면 됩니다:

        | effect (Fork work), cont -> Queue.push (fun () -> start work) ready; continue cont ()
    영어에서 번역원문 보기
  2. 고유 링크

    그런데 이 버전에서는 start 함수로 감싸야 하는 것 같아요. 핸들러 안에서 work를 호출하면 그 핸들러가 함수를 둘러싸고 있지 않으니까요. 이게 꼭 필요한 건지 어떻게 생각하세요, 그렇다면 예제 스케줄러와 비교해 좀 비대칭적으로 느껴지거든요? 단지 Effect.Deep에는 왜 Effect.Shallow의 fiber와 비슷한 기본 요소가 없는지 궁금했어요.

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. 제 go 파이프라인 구현을 검토해주세요 (아직 배우는 중입니다)

    여러분 안녕하세요, go와 동시성 기능을 배우고 있는데, 흔한 패턴 중 하나가 “파이프라인”이더군요. 제가 구현한 버전인데 검토와 개선할 점에 대한 조언을 부탁드립니다 그리고 pubsub 같은 중요하고 널리 쓰이는 동시성 패…

    답글 3최근 활동 go