1

我无法使用 lwt 进行数据库访问。我应该将它包含在一个线程中吗?如何?或者创建一个返回'a lwt值的新线程?如果是这样,如何处理该值?

也是如此Printf.eprintf,它似乎也被 lwt 阻止了。所以我改用 Lwt_io。但为什么 lwt 会阻止常规 io?

我所拥有的是一个简单的数据库请求,例如Db.update session. 它在一个Lwt_main.run main函数内。所有这些都在一个 CGI 脚本中(没关系,数据库访问工作正常,直到我开始使用 lwt 命令)。

如果需要,我可以给你更多代码。

问候
Olle

编辑

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

1 回答 1

3

Printf.eprintf不是“阻塞”的,只是缓冲参数发生了变化,并且在程序结束之前通常不会显示消息。您应该尝试eprintf "something\n%!"%!意思是“冲洗”),但是是的,最好使用Lwt_io.

对于数据库,我不知道,您没有说您使用的是哪个库(至少调用ocaml-mysql的库不是 Lwt 友好的,因此可能需要 using Lwt_preemptive)。

编辑

您的:

Lwt_preemptive.detach (fun () -> Db.call) ()

这个调用创建了一个线程,一旦执行,就会立即返回function 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
于 2013-09-30T23:18:50.337 回答