【问题标题】:How to fully utilise lwt_pool?如何充分利用 lwt_pool?
【发布时间】:2013-06-25 11:30:26
【问题描述】:

我在 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)。驱动其实很简单,就是一个TCP(Unix.file_descr)连接到MongoDB服务器,和服务器发送请求/接收响应。


`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 (fun b -> unit) 作为参数的函数。谁来提供(fun b -> unit)? Lwt_pool 本身有这样的功能吗?还是我应该提供?那该怎么办呢?

谢谢

【问题讨论】:

    标签: ocaml ocsigen lwt


    【解决方案1】:

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

    可以对 Unix 文件描述符做的一件事是确定它是否连接到网络套接字:

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

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

    【讨论】:

    • 太棒了。请记住,这只是查询本地状态以确定文件描述符的类型。它不会验证有关连接状态的任何内容。如果您想查询更多本地状态,可以使用Unix.getsocknameUnix.getpeername 查看本地和远程IP 地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2018-03-20
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多