【问题标题】:How to make something lwt supported?如何制作支持 lwt 的东西?
【发布时间】:2013-06-29 15:54:09
【问题描述】:

我正在努力理解 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)

支持my_data_list中有5数据项,5个数据项是顺序写入数据库还是并行写入数据库?


他们说,也可以手动使用 Lwt 或 http://ocsigen.org/tutorial/application

使用 Lwt 非常简单,不会造成麻烦,前提是您从未 使用阻塞函数(非协作函数)。阻塞函数 可能会导致主服务器挂起!

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

【问题讨论】:

    标签: ocaml ocsigen ocaml-lwt


    【解决方案1】:

    是的,您的代码是正确的。 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 的 IO 操作,你应该使用 Lwt 版本(Lwt_unix.sleep 而不是Unix.sleep

    【讨论】:

    • 在你的例子中 Lwt_unix.sleep 而不是 Unix.sleep,我应该为我的 Db.write conn data 做一些特别的事情吗?
    • 在你的情况下让它返回一个 lwt 值就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2011-05-28
    相关资源
    最近更新 更多