如何制作lwt支持的东西?

时间:2013-07-02 10:12:05

标签: ocaml ocsigen ocaml-lwt

我想了解术语lwt supported


假设我有一段连接数据库并编写一些数据的代码:Db.write conn data。它与lwt无关,每次写入都需要花费10 sec

现在,我想使用lwt。我可以直接编码如下吗?

let write_all data_list = Lwt_list.iter (Db.write conn) data_list
let _ = Lwt_main.run(write_all my_data_list)

支持5中有my_data_list个数据项,是否会将所有5个数据项顺序或并行写入数据库?


同样在Lwt手动或http://ocsigen.org/tutorial/application,他们说

  

使用Lwt非常容易,并且不会造成麻烦,前提是您从未   使用阻塞函数(非协作函数)。阻止功能   会导致entre服务器挂起!

我完全不明白如何使用阻止函数。对于我自己的每个函数,我都可以使用Lwt.return来创建它{{strong> 1}}?

1 个答案:

答案 0 :(得分:4)

是的,您的代码是正确的。 lwt supported的原则是,代码中可能需要花费时间的所有内容都应返回Lwt值。

关于Lwt_list.iter,您可以选择iter_piter_s之间选择是平行还是顺序治疗:

  

在iter_s f l中,iter_s将在每个元素上调用f   l,等待每个元素之间的完成。在   相反,在iter_p f l中,iter_p将调用f   l的元素,然后等待所有线程终止。

关于非阻塞函数,轻量级线程的原理是它们一直运行直到它们到达“合作点”,即线程可以被安全地中断或无关的点,例如sleep

但是你必须在实际执行sleep之前声明你进入“合作点”。这就是整个Unix库被包装的原因,因此当你想进行需要时间的操作(例如write)时,会自动达到一个合作点。

对于您自己的函数,如果您使用Unix的IOs操作,则应使用Lwt版本(Lwt_unix.sleep而不是Unix.sleep