ocaml - 如何使某些东西支持 lwt?

标签 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 , 他们说

Using Lwt is very easy and does not cause troubles, provided you never use blocking functions (non cooperative functions). Blocking functions can cause the entre server to hang!



我完全不明白如何不使用阻塞函数。 对于我自己的每个函数,我可以使用 Lwt.return使其成为lwt support ?

最佳答案

是的,你的代码是正确的。 lwt supported的原理代码中所有可能需要时间的东西都应该返回一个 Lwt 值。

关于Lwt_list.iter,您可以通过在iter_p之间进行选择来选择您希望处理是并行的还是顺序的。和 iter_s :

In iter_s f l, iter_s will call f on each elements of l, waiting for completion between each element. On the contrary, in iter_p f l, iter_p will call f on all elements of l, then wait for all the threads to terminate.



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

但是你必须在真正做sleep之前声明你进入了一个“合作点”。 .这就是为什么整个 Unix 库都被包装起来的原因,这样当你想做一个需要时间的操作(例如 write)时,会自动到达一个合作点。

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

关于ocaml - 如何使某些东西支持 lwt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17422910/

相关文章:

pattern-matching - OCaml 多态变体 : bind the same name in multiple match patterns

ocaml - 是否可以在 OCaml 解释器中使用箭头键?

stream - ocaml 中的流真的被使用了吗?

ocaml - Lwt 泄漏文件描述符,不确定是 bug 还是我的代码

polymorphism - OCaml 中的空树类型

syntax - OCaml中的一元减号和 float

ocaml - 为什么Oxygen 不能运行我的python 文件?

types - 双重强制什么时候有用?

client - Eliom错误: {client{}}

subprocess - LWT 与子流程的简单交互