我想了解术语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非常容易,并且不会造成麻烦,前提是您从未 使用阻塞函数(非协作函数)。阻止功能 会导致entre服务器挂起!
我完全不明白如何不使用阻止函数。对于我自己的每个函数,我都可以使用Lwt.return
来创建它{{strong> 1}}?
答案 0 :(得分:4)
是的,您的代码是正确的。 lwt supported
的原则是,代码中可能需要花费时间的所有内容都应返回Lwt值。
关于Lwt_list.iter,您可以选择iter_p
和iter_s
之间选择是平行还是顺序治疗:
在iter_s f l中,iter_s将在每个元素上调用f l,等待每个元素之间的完成。在 相反,在iter_p f l中,iter_p将调用f l的元素,然后等待所有线程终止。
关于非阻塞函数,轻量级线程的原理是它们一直运行直到它们到达“合作点”,即线程可以被安全地中断或无关的点,例如sleep
。
但是你必须在实际执行sleep
之前声明你进入“合作点”。这就是整个Unix库被包装的原因,因此当你想进行需要时间的操作(例如write
)时,会自动达到一个合作点。
对于您自己的函数,如果您使用Unix的IOs操作,则应使用Lwt版本(Lwt_unix.sleep
而不是Unix.sleep
)