【问题标题】:How to fully utilise `lwt` in this case在这种情况下如何充分利用 `lwt`
【发布时间】:2013-06-15 16:46:06
【问题描述】:

这是我要做的:

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

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


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


对于任务调度部分,我可以这样做(How to schedule a task in OCaml?):

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

let _ = Lwt_main.run (start())  

问题来自实际的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))

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

对于计算部分,所有的计算会按顺序执行吗?

另外,谁能简单介绍一下lwt的机制?在内部,light weight thread的逻辑是什么?为什么它可以并行处理IO?

【问题讨论】:

标签: ocaml ocaml-lwt


【解决方案1】:

要使用 lwt 进行并行计算,您可以检查 lwt_list module,尤其是 iter_p。

val iter_p : ('a -> unit Lwt.t) -> 'a list -> unit Lwt.t

iter_p f l 对 l 的每个元素调用 f 函数,然后等待所有线程终止。出于您的目的,它看起来像:

let do_tasks tasks = List.iter_p do_task tasks

假设“tasks”是一个任务列表。

【讨论】:

  • 是否需要将task 设为lwt supported
  • 我不确定我理解你所说的支持 lwt 是什么意思?任务可以是您想要的任何类型(请参阅 iter_p 采用 a' 列表)。唯一需要的是do_task返回Lwt(如果不是自然的,把Lwt.return()放在最后)
猜你喜欢
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 2017-04-29
  • 2022-01-23
  • 2015-11-30
  • 2017-05-16
  • 2012-10-06
相关资源
最近更新 更多