如何充分利用lwt_pool?

时间:2013-06-25 11:30:26

标签: ocaml ocsigen lwt

我在Lwt_pool.create的检查和验证功能上苦苦挣扎,并且在这里有一些问题。


val create : 
  int ->

  ?check:('a -> (bool -> unit) -> unit) ->

  ?validate:('a -> bool Lwt.t) -> (unit -> 'a Lwt.t) -> 'a t

首先,让我描述一下我的使用背景。

我希望使用Lwt_pool来管理数据库连接池。数据库为MongoDB,驱动程序由我自己创建(Mongo.ml)。驱动程序实际上很简单,它只是与MongoDB服务器的TCP(Unix.file_descr)连接,并向服务器发送请求/接收响应。


`create n ?check ?validate f` creates a new pool with at most n members. f is the function to use to create a new pool member.

An element of the pool is validated by the optional validate function before its Lwt_pool.use. Invalid elements are re-created.

The optional function check is called after a use of an element failed. It must call its argument excatly one with true if the pool member is still valid and false otherwise.

以上是create

的文档

所以这是我的问题:

从文档中,我了解验证是在使用之前验证连接。

所以我的第一个问题是如何检查Unix.file_descr的可用性?我只知道为了检查它,我已经通过它发送了一些东西,对吧?但是如果我通过我的连接发送一些东西以便检查,那么我想它会很难看,而且无论如何我想通过Lwt_pool.use发送一些东西,为什么在使用之前还要做类似的事情?


我的第二个问题是检查。

因此检查将在使用后使用。从文档中,我真的无法理解。 check是一个函数,它将my_db_connection(在我的情况下)和(fun b - >单位)作为参数。谁将提供(有趣的b - >单位)? Lwt_pool本身有这样的功能吗?或者我应该提供它?那么做什么呢?

感谢

1 个答案:

答案 0 :(得分:2)

我对Lwt一无所知,但有一件事要等到使用验证功能,直到你明白为什么需要它。这就是为什么它是一个可选参数(我怀疑)。

可以使用Unix文件描述符做的一件事是弄清楚它是否附加到网络套接字:

let is_a_socket fd = (Unix.fstat fd).st_kind = S_SOCK

也许这会有用,虽然有Lwt经验的人可能会给出更好的答案。