我正在努力理解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来实现lwt support?
发布于 2013-07-02 10:46:52
是的,你的代码是正确的。lwt supported的原则是,代码中可能需要时间的所有内容都应该返回一个Lwt值。
关于Lwt_list.iter,通过在iter_p和iter_s之间进行选择,您可以选择是并行的还是连续的:
在iter_s f l中,iter_s将对l的每个元素调用f,等待在每个元素之间完成。相反,在iter_p f l中,iter_p将对l的所有元素调用f,然后等待所有线程终止。
关于非阻塞函数,轻量级线程的原理是,它们一直运行直到到达“协作点”,即线程可以安全中断或没有任何事情可做的点,比如在sleep中。
但在实际执行sleep之前,您必须声明输入了一个“合作点”。这就是为什么整个Unix库已经被包装,这样当您想要执行一个需要时间(例如write)的操作时,就会自动到达一个协作点。
对于您自己的函数,如果使用Unix中的IOs操作,则应该使用Lwt版本(Lwt_unix.sleep而不是Unix.sleep)。
https://stackoverflow.com/questions/17422910
复制相似问题