首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ocaml Lwt.wait()

Ocaml Lwt.wait()
EN

Stack Overflow用户
提问于 2017-02-02 02:10:15
回答 1查看 745关注 0票数 1

我有一个关于lwt的等待函数的问题,以及我如何在我自己的自定义函数中使用它,它将返回一个'a Lwt.t线程。首先让我们给你展示一个例子。

代码语言:javascript
复制
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()

在上面的函数中,我调用wait来生成一个休眠线程和它的唤醒程序,但是我不确定如何为休眠线程提供一个可能的整数应答,并且仍然能够从get_int函数返回一个休眠线程。我提供了一行代码(Lwt_io.read_int(i) >>= fun I -> Lwt.wakeup w;),它似乎可以工作,但我不确定这是否是完成此任务的正确方法。有任何指示、链接或评论吗?

注意:我之所以这样问,是因为将Lwt_io.read_int(i)添加到函数中是多余的。我可以去掉get_int函数,只调用Lwt_io.read_int(i),但我很好奇如果没有冗余,您将如何做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-02 02:38:48

首先,让我们切换到一个新的Lwt术语。根据Lwt库中接受的新术语,Lwt.wait函数返回一个promise和一个解析器。

这是一个非常低级的接口,通常用于实现更多的高级接口。实际上,在您的示例中,可以仅将get_int函数实现为Lwt_io.read_int

因此,为了实验的目的,让我们实现一些稍微更有意义的东西:

代码语言:javascript
复制
let wait () =
   let promise, resolver = Lwt.wait () in
   Lwt.async (fun () ->
      Lwt_unix.sleep (Random.float 1.0) >|= 
      Lwt.wakeup resolver);
   promise

我们的wait函数返回一个promise,它将在随机延迟后实现。您可能会看到,有一个对Lwt.async的调用,它将获取一个thunk并在事件处理程序中异步地执行它,因此函数wait立即返回。当然,这个示例并没有多大意义,因为具有相同语义的函数可以实现为:

代码语言:javascript
复制
let wait () = Lwt_unix.sleep 1.0

但这表明,只有实现Lwt原语时才需要wait函数。

当您需要解耦服务提供者和服务使用者时,可以合理地使用此接口。然后你可以使用Lwt.wait (或者更好的Lwt.add_task_*,例如,

代码语言:javascript
复制
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

当然,我们只是重新实现了mailbox (这是另一个证明,我们通常不需要那么低,因为一切都已经为我们完成了),但通常,当你有多个请求,并且你想实现自己的调度时,你可以使用这个低级接口。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41986723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档