我无法使用lwt进行数据库访问。我应该把它包含在一个帖子里吗?怎么样?或者创建一个返回'a lwt
值的新线程?如果是这样,该怎么办?
同样适用于Printf.eprintf
,它似乎也被lwt阻止。所以我改用Lwt_io。但是为什么lwt会阻止常规的io?
我所拥有的是一个简单的数据库请求,如Db.update session
。它在Lwt_main.run main
函数内。所有这些都在一个CGI脚本中(无论如何,数据库访问工作正常,直到我开始使用lwt命令)。
如果需要,我可以给你更多代码。
问候
欧莱
修改
let main sock env =
(* code omitted *)
Gamesession.update_game_session env#db game_session_connected;
(* code omitted *)
Lwt_main.run (main sock_listen env)
修改2
这是解决方案:
Lwt_preemptive.detach (fun () -> Db.call) ()
答案 0 :(得分:2)
Printf.eprintf
未被“阻止”,只是缓冲参数被更改,并且通常在程序结束之前不显示消息。您应该尝试eprintf "something\n%!"
(%!
表示“刷新”),但是最好使用Lwt_io
。
对于数据库,我不知道,您没有说明您正在使用哪个库(至少名为ocaml-mysql
的库不是Lwt友好的,因此可能需要使用Lwt_preemptive
)。
您:
Lwt_preemptive.detach (fun () -> Db.call) ()
此调用创建一个线程,一旦执行,立即返回 函数Db.call
。所以,基本上在这种情况下Lwt_preemptive.detach
什么都不做:)
我不知道ocaml-mysql但是如果:
Db.call: connection_params -> connection_handle
你会有
let lwt_db_call connection_params =
Lwt_preemptive.detach Db.call connection_params