【问题标题】:Lwt and database accessLwt 和数据库访问
【发布时间】:2013-09-28 20:06:59
【问题描述】:

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

【问题讨论】:

  • 关于 Lwt 的重要一点是,当您开始使用它时,您必须只使用 Lwt。你不能对 Lwt 使用任何阻塞函数。
  • 那么从 Lwt 的角度来看,什么是阻塞函数?它是怎么知道的?
  • @Olle,你考虑过使用 postgresql 吗?它有关于 OCaml 和 Lwt 的很好的例子。我可以指出一些。
  • 您好,Kakadu,感谢您的提示。我的代码库使用的是 MySQL,所以现在不能切换。至少这不是一件容易的事。一些例子可能仍然有帮助,也许?如果您有任何链接,我很乐意阅读。

标签: mysql database ocaml ocaml-lwt


【解决方案1】:

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

【讨论】:

  • 是的,它是 ocaml-mysql 之一。我会调查 Lwt_preemptive!
  • 关于如何使用Lwt_preemptive有什么建议吗?如果我使用 run_in_main,我的脚本就会挂起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 2011-06-01
  • 1970-01-01
  • 2010-11-30
  • 2018-06-11
  • 2013-04-26
相关资源
最近更新 更多