我在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.
以上是创建的文档
以下是我的问题:
从文档中,我理解validate就是在使用之前验证连接
所以我的第一个问题是如何检查Unix.file_descr的可用性我只知道为了检查它,我已经通过它发送了一些东西,对吧?但是,如果我通过连接发送一些东西来进行检查,那么我想这会很紧急,而且我无论如何都想通过Lwt_pool.use
发送一些东西,为什么要在使用前做类似的事情呢?
我的第二个问题是关于支票的。
因此,使用后将使用check。从医生那里,我真的无法理解。check是一个以my_db_connection(在我的例子中)和a(funb->单元)为参数的函数。谁将提供(有趣的b->单元)?Lwt_pool本身有这样的函数吗?还是我应该提供?那该怎么办?
感谢
我对Lwt一无所知,但要做的一件事是等待使用验证函数,直到你明白为什么需要它。这就是为什么它是一个可选参数(我怀疑)。
可以使用Unix文件描述符做的一件事是弄清楚它是否连接到网络套接字:
let is_a_socket fd = (Unix.fstat fd).st_kind = S_SOCK
也许这会很有用,尽管有Lwt经验的人可能会给出更好的答案。