我试图理解术语 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_p
和 iter_s
之间进行选择来选择是并行处理还是顺序处理:
关于非阻塞函数,轻量级线程的原理是它们一直运行直到到达“合作点”,即线程可以安全中断或无事可做的点,就像在 sleep
中一样。
但是您必须在实际执行 sleep
之前声明您输入了“合作点”。这就是为什么整个 Unix 库都被包装起来的原因,这样当你想做一个需要时间的操作(例如 write
)时,会自动到达一个合作点。
对于你自己的函数,如果你使用 Unix 的 IOs 操作,你应该使用 Lwt 版本( Lwt_unix.sleep
而不是 Unix.sleep
)
关于ocaml - 如何使某些东西支持 lwt?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17422910/