【发布时间】: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 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?
【问题讨论】:
-
让我解决您关于
lwt和轻量级线程的问题:lecture on monads(course)和Jerome Vouillon “Lwt: a Cooperative Thread Library”。 (与我在另一个线程中的评论中的链接相同。) -
@lukstafi:您应该将此添加为答案而不是评论。
-
@gasche -- no link-only answers :-)
-
@lukstafi:当然,StackOverflow 宁愿让您在 StackOverflow 中手动排版 Jérôme 的文章,以便他们获得更多的谷歌点击量。