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
Другие вопросы по тегам