gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:07:38 29 4
gpt4 key购买 nike

我试图理解术语 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com