在这种情况下如何充分利用`lwt`

Jac*_*ale 1 ocaml ocaml-lwt

这是我要做的事情:

我有一个列表,task我需要每1小时运行一次(调度).

所有这些任务都是相似的.例如,对于一项任务,我需要从服务器下载一些数据(使用http协议,需要5-8秒),然后对数据进行计算(需要1到5秒).


我想我可以lwt用来实现这些,但无法找出效率的最佳方法.


对于任务调度部分,我可以这样做(如何在OCaml中安排任务?):

let rec start () = 
  (Lwt_unix.sleep 1.)  >>= (fun () -> print_endline "Hello, world !"; start ())

let _ = Lwt_main.run (start())  
Run Code Online (Sandbox Code Playgroud)

问题来自实际的do_task部分.

所以任务涉及http downloadcomputation.

http download部分必须等待5至8秒.如果我真的逐个执行每个任务,那么它会浪费带宽,当然,我希望所有任务的下载过程是并行的.那么我应该把这个下载部分放到lwt上吗?并将lwt并行处理所有下载?

通过代码,我应该这样做吗?:

let content = function
  | Some (_, body) -> Cohttp_lwt_unix.Body.string_of_body body
  | _ -> return ""


let download task = 
  Cohttp_lwt_unix.Client.get ("http://dataserver/task?name="^task.name)

let get_data task = 
  (download task)  >>= (fun response -> Lwt.return (Content response))

let do_task task = 
  (get_data task) >>= (fun data -> Lwt.return_unit (calculate data))
Run Code Online (Sandbox Code Playgroud)

那么,通过上面的代码,所有任务是否将并行执行,至少对于该http download部分?

对于计算部分,是否所有计算都按顺序执行?

此外,任何人都可以简要描述一下这种机制lwt吗?在内部,逻辑是light weight thread什么?为什么它可以并行处理IO?

Chr*_*Lec 5

要使用lwt进行并行计算,可以检查lwt_list模块,尤其是iter_p.

val iter_p : ('a -> unit Lwt.t) -> 'a list -> unit Lwt.t
Run Code Online (Sandbox Code Playgroud)

iter_p fl在l的每个元素上调用函数f,然后等待所有线程终止.为了您的目的,它看起来像:

let do_tasks tasks = List.iter_p do_task tasks
Run Code Online (Sandbox Code Playgroud)

假设"任务"是一个任务列表.

  • 我不确定我理解lwt支持你的意思吗?任务可以是您想要的任何类型(请参阅iter_p采用'列表').唯一必要的是do_task返回Lwt(如果它不自然,只需将Lwt.return()放在最后) (2认同)