2017-02-01 6 views
1

나는 lwt의 대기 함수에 대한 질문을 가지고 있는데, 어떻게하면 Lwt.t 스레드를 리턴 할까? 먼저 예제를 보여 드리겠습니다. 내가 전화 위의 함수에서 Ocaml Lwt.wait()

open Lwt_io 
open Lwt.Infix 

let i, o = Lwt_io.pipe() 

let get_int() = 
    let t, w = Lwt.wait() in 
    (*what do I do here to provide the sleeping thread*) 
    (*with a possible integer reply*) 
    Lwt_io.read_int(i) >>= fun i -> Lwt.wakeup w i; 
    t 

let ans = get_int() 

는 잠자는 스레드 플러스의 wakener을 생산하기 위해 기다려야하지만 가능한 정수 응답과 잠자는 스레드를 제공하고 여전히 GET_INT에서 잠자는 스레드를 반환 할 수하는 방법을 확실 해요 기능. 나는 (Lwt_io.read_int (i) >> = fun i -> Lwt.wakeup w i;)이 작동하는 것처럼 보이지만이 작업을 수행하는 올바른 방법인지 확신 할 수는 없다. 모든 포인터 또는 링크 또는 주석?

참고 : Lwt_io.read_int (i)를 함수에 추가하는 것이 불필요하기 때문에 묻습니다. 난 그냥 get_int 함수를 제거하고 그냥 Lwt_io.read_int (i)를 호출 할 수 있지만 중복없이 이것을 어떻게 할 것인지 궁금하다.

답변

4

우선, 새로운 Lwt 용어로 전환 해 보겠습니다. Lwt 라이브러리에서 허용되는 새로운 용어에 따르면 Lwt.wait 함수는 약속과 확인자를 반환합니다.

이 인터페이스는 상당히 낮은 수준의 인터페이스로, 일반적으로 더 많은 고급 인터페이스를 구현하는 데 사용됩니다. 실제로, get_int 함수는 Lwt_io.read_int으로 구현 될 수 있습니다.

let wait() = 
    let promise, resolver = Lwt.wait() in 
    Lwt.async (fun() -> 
     Lwt_unix.sleep (Random.float 1.0) >|= 
     Lwt.wakeup resolver); 
    promise 

우리 wait 기능은 임의의 지연 후에 성취 될 약속을, 반환

그래서 실험을 위해의 약간 더 의미가 무엇인가를 구현할 수 있습니다. Lwt.async을 호출하여 썽크를 취하여 이벤트 핸들러에서 비동기 적으로 실행한다는 것을 알 수 있으므로 함수 wait이 즉시 반환됩니다.

let wait() = Lwt_unix.sleep 1.0 

그러나 이것은 단지 wait 기능이 LWT 프리미티브를 구현하는 데에만 필요하다는 것을 보여줍니다 : 동일한 의미와 기능으로 구현 될 수 물론이 예는 훨씬 더 이해가되지 않습니다.

이 인터페이스의 정당화 된 사용법 중 하나는 서비스 공급자와 서비스 소비자를 분리해야 할 때입니다. 그럼 당신은 그 모든 것이 이미 우리가 일반적으로, 그 낮은 갈 필요가 없습니다, 또 다른 증거입니다 (Lwt.wait (또는 Lwt.add_task_* 더 나은, 예를 들어,

module Broker = sig 
    type 'a t 
    val request : 'a t -> 'a Lwt.t 
    val provide : 'a t -> 'a -> unit 
end = struct 
    type 'a t = {mutable requested : 'a Lwt.u option} 

    let request broker = 
    let promise, request = Lwt.wait() in 
    broker.requested <- Some request; 
    promise 

    let provide broker data = match broker.requested with 
    | None ->() 
    | Some request -> Lwt.wakeup request data 
end 

물론, 우리는 단지 재 구현 사서함을 사용할 수 있습니다 done for us) 그러나 일반적으로 요청이 여러 개인 경우 자신의 일정을 구현하려는 경우이 낮은 수준의 인터페이스를 사용할 수 있습니다.