如何发送多条tpc消息并在成功后继续发送

问题描述 投票:1回答:1

我当前正在编写一些网络代码,我需要发送大量消息,然后等待单个响应。

鉴于我有一个函数可以返回我拥有的套接字的输入和输出通道:

let resps = List.map uris ~f:(fun uri -> 
  let%lwt (ic,oc) = connect uri in
  let%lwt () = Lwt_io.write_value oc msg in
  Lwt_io.read_value ic
) in
Lwt.pick resps

我对此的理解是,在resps中履行了诺言之后,选择权应取消所有正在进行的请求。问题是,如果这些连接中的任何一个失败/被拒绝,则会引发异常Unix.ECONNREFUSED

我的问题是迫使Lwt.pick忽略异常的正确语义是什么?

到目前为止,我想到的选择是抓住请求中的异常显式:

let resps = List.map uris ~f:(fun uri -> 
  try
  let%lwt (ic,oc) = connect uri in
  let%lwt () = Lwt_io.write_value oc msg in
  Lwt_io.read_value ic
  with Unix_error (e,_,_) -> ...
) in
Lwt.pick resps

但是我不确定Lwt.pick在什么条件下会看到那些承诺被拒绝了?

更新:我现在使用可取消,无法兑现的承诺处理错误:

fst @@ Lwt.task ()

这感觉很笨拙,但到目前为止似乎还可以。

ocaml ocaml-lwt
1个回答
0
投票

显式处理异常是正确的。当您显式拒绝(使用Lwt.fail)或在Lwt捕获了异常时,在应返回承诺的回调中(如您将传递给Lwt.bind的承诺),Lwt承诺将被拒绝。

但是,要处理调用Lwt的代码中的异常,必须使用try%lwt而不是普通的try

© www.soinside.com 2019 - 2024. All rights reserved.