首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在这种情况下充分利用` in‘

如何在这种情况下充分利用` in‘
EN

Stack Overflow用户
提问于 2013-06-15 16:46:06
回答 1查看 503关注 0票数 1

以下是我要做的事:

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

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

我认为我可以使用lwt来实现这些目标,但无法找到提高效率的最佳方法。

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

代码语言:javascript
复制
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将并行处理所有下载吗?

代码上说,我应该这样做吗?

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-17 09:51:04

要使用lwt进行并行计算,可以检查列表模块,特别是iter_p。

代码语言:javascript
复制
val iter_p : ('a -> unit Lwt.t) -> 'a list -> unit Lwt.t

iter_p f l对l的每个元素调用函数f,然后等待所有线程终止。为了你的目的,它看起来是:

代码语言:javascript
复制
let do_tasks tasks = List.iter_p do_task tasks

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17125824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档