我试图理解术语 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.return 使其成为 lwt support 吗?

最佳答案

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

关于 Lwt_list.iter,您可以通过在 iter_piter_s 之间进行选择来选择是并行处理还是顺序处理:



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

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

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

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

10-10 01:03