以下是我要做的事情:
我有一个task
列表,我需要每隔1小时运行一次( schedule )。
所有这些任务都是相似的。例如,对于一项任务,我需要从服务器下载一些数据(使用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 download
和computation
。
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?
答案 0 :(得分:5)
要使用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
假设“任务”是一个任务列表。