Как полностью использовать lwt_pool?
Я борюсь за проверку и проверку функции для 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 - это функция, которая принимает my_db_connection (в моем случае) и a (fun b -> unit) в качестве параметра. Кто обеспечит (весело б -> блок)? Есть ли у самой Lwt_pool такая функция? или я должен это предоставить? Что делать то?
Спасибо
1 ответ
Я ничего не знаю о Lwt, но нужно подождать, чтобы использовать функцию проверки, пока вы не поймете, зачем вам это нужно. Вот почему это необязательный параметр (я подозреваю).
Одна вещь, которую вы можете сделать с файловым дескриптором Unix, это выяснить, подключен ли он к сетевому сокету:
let is_a_socket fd = (Unix.fstat fd).st_kind = S_SOCK
Возможно, это будет полезно, хотя кто-то с опытом работы в Lwt может дать лучший ответ.