Как сделать что-то поддерживаемое lwt?

Я пытаюсь понять термин lwt supported,


Итак, предположим, у меня есть кусок кода, который соединяет базу данных и записывает некоторые данные: Db.write conn data, Это не имеет ничего общего с lwt, и каждая запись будет стоить 10 sec,

Теперь я хотел бы использовать lwt. Могу ли я напрямую кодировать, как показано ниже?

let write_all data_list = Lwt_list.iter (Db.write conn) data_list
let _ = Lwt_main.run(write_all my_data_list)

Поддержка есть 5 элементы данных в my_data_listБудут ли все 5 элементов данных записываться в базу данных последовательно или параллельно?


Также в Lwt вручную или http://ocsigen.org/tutorial/application, они говорят

Использование Lwt очень просто и не вызывает проблем, если вы никогда не используете блокирующие функции (не совместные функции). Блокировка функций может привести к зависанию сервера entre!

Я совершенно не понимаю, как не использовать функции блокировки. Для каждой моей собственной функции, я могу просто использовать Lwt.return сделать это lwt support?

1 ответ

Решение

Да, ваш код правильный. Принцип lwt supported в том, что все, что может потенциально занять время в вашем коде, должно возвращать значение Lwt.

В Lwt_list.iter вы можете выбрать, хотите ли вы, чтобы лечение было параллельным или последовательным, выбирая между iter_p а также iter_s:

В iter_s f l iter_s будет вызывать f для каждого элемента l, ожидая завершения между каждым элементом. Напротив, в iter_p f l iter_p будет вызывать f для всех элементов l, а затем ждать завершения всех потоков.

Что касается неблокирующих функций, принцип легковесных нитей заключается в том, что они продолжают работать до тех пор, пока не достигнут "точки взаимодействия", то есть точки, в которой нить может быть безопасно прервана или не имеет ничего общего, как в sleep,

Но вы должны объявить, что вы вводите "точку сотрудничества", прежде чем делать sleep, Вот почему вся библиотека Unix была обернута, поэтому, когда вы хотите выполнить операцию, которая требует времени (например, write), точка сотрудничества достигается автоматически.

Для вашей собственной функции, если вы используете операции ввода-вывода из Unix, вы должны вместо этого использовать версию Lwt (Lwt_unix.sleep вместо Unix.sleep)

Другие вопросы по тегам