LWT и доступ к базе данных
Я не могу получить доступ к своей базе данных с помощью lwt. Должен ли я включить его в поток? Как? Или создайте новую тему, которая возвращает 'a lwt
значение? Если так, что делать с этим значением?
То же самое касается Printf.eprintf
, который также, кажется, заблокирован lwt. Поэтому я использую Lwt_io вместо этого. Но почему бы lwt блокировать регулярный ввод-вывод?
Что у меня есть простой запрос БД, как 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) ()
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