我无法使用 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) ()
Printf.eprintf
没有被"阻止",只是缓冲参数发生了变化,并且通常在程序结束之前不会显示消息。您应该尝试eprintf "somethingn%!"
(%!
的意思是"冲洗"),但是是的,最好使用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