Lwt和数据库访问

时间:2013-09-28 20:06:59

标签: mysql database ocaml ocaml-lwt

我无法使用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) ()

1 个答案:

答案 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