4

我试图理解这个词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_list5个数据项是顺序写入数据库还是并行写入数据库?


他们还说在 Lwt 中手动或http://ocsigen.org/tutorial/application

使用 Lwt 非常容易并且不会造成麻烦,前提是您从不使用阻塞函数(非协作函数)。阻塞函数会导致 entre 服务器挂起!

我完全不明白如何使用阻塞功能。对于我自己的每一个功能,我可以用Lwt.return它来制作它lwt support吗?

4

1 回答 1

4

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

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

在iter_s fl中,iter_s会对l的每个元素调用f,等待每个元素之间的完成。相反,在iter_p fl 中,iter_p 会对l 的所有元素调用f,然后等待所有线程终止。

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

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

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

于 2013-07-02T10:46:52.970 回答