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) ()

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

相关内容

  • 没有找到相关文章

最新更新