我正在努力理解术语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个数据项按顺序或并行写入数据库
也可手动或http://ocsigen.org/tutorial/application,他们说
使用Lwt非常简单,不会造成麻烦,前提是您永远不会使用阻塞函数(非协作函数)。阻塞功能可能导致entre服务器挂起!
我很不明白如何不使用阻塞函数对于我自己的每个函数,我可以使用Lwt.return
使其成为lwt support
吗?
lwt supported
的原理是,代码中可能需要时间的所有内容都应该返回Lwt值。
关于Lwt_list.iter,您可以通过在iter_p
和iter_s
:之间进行选择来选择是希望并行治疗还是顺序治疗
在iter_sfl中,iter_s将对每个元素调用f在每个元素之间等待完成。关于相反,在iterpfl中,iterpall将调用f元素,然后等待所有线程终止。
关于非阻塞函数,轻量级线程的原理是它们保持运行直到达到"阻塞";合作点";,即线程可以像在sleep
中那样被安全地中断或无事可做的点。
但你必须声明你进入了一个";合作点";在实际执行CCD_ 12之前。这就是为什么整个Unix库都被封装了,这样当你想做一个需要时间的操作(例如write
)时,就会自动到达一个合作点。
对于您自己的功能,如果您使用Unix中的IO操作,则应该使用Lwt版本(Lwt_unix.sleep
而不是Unix.sleep
)