Действительно ли OCaml подходит для записи сетевых серверов?

Я задавался вопросом, будет ли OCaml работать хорошо с точки зрения производительности и простоты реализации при контакте с типичными клиент-серверными взаимодействиями по TCP в многопоточной среде.. Я имею в виду что-то действительно типичное как наличие потока на клиент, который получает данные, управляемые изменения на игровых состояниях, и передайте их обратно клиентам.

Это, потому что я должен записать сервер для игры и меня всегда, делало эти вещи в C, но так как теперь я знаю OCaml, который мне было любопытно знать, будет ли это в порядке, или я буду просто пробовать для решения типичной проблемы на языке, который не соответствует хорошо этому..

Заранее спасибо

12
задан Jack 14 July 2010 в 10:00
поделиться

3 ответа

Производительность: вероятно, нет. Потоки OCaml не обеспечивают параллельного выполнения, они являются лишь способом структурирования вашей программы. Сама среда выполнения OCaml не является потокобезопасной, поэтому единственным кодом, который может выполняться параллельно в одном потоке OCaml, будет сопряженный код на C (без обратных вызовов OCaml!).

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

Простота реализации: это не изменит мир. У вас будет удобство OCaml и pthread-подобная библиотека на стороне. Если вы ищете новые возможности, используя то, что вы узнали из OCaml, я рекомендую Jocaml. Он то синхронизируется, то расходится с OCaml, но совсем недавно произошла (пере)реализация, и даже когда он немного расходится, это очень весело, и это совершенно новый взгляд на параллельные программы.

Jocaml реализован поверх OCaml. Поскольку время выполнения не является параллельным и все такое, я почти уверен, что он использует отдельные процессы и передачу сообщений. Но для приложения, которое вы упомянули, он должен быть в состоянии сделать все хорошо.

10
ответ дан 2 December 2019 в 07:02
поделиться

OCaml отлично подходит для сетевых приложений, если вы можете работать с относительно небольшим количеством активных одновременно потоков - скажем, не более 100. Вы можете рассмотреть MLdonkey в качестве примера, хотя и в клиентском пространстве, а не в серверное пространство.

2
ответ дан 2 December 2019 в 07:02
поделиться

OCaml вполне подходит для написания сетевых серверов, хотя, как отмечает Паскаль, существуют ограничения на многопоточность.

К счастью, многопоточность - не единственный способ организовать такую ​​программу. Библиотека Lwt (для легких потоков) предоставляет абстракцию асинхронного ввода-вывода, которая довольно проста в использовании (особенно в сочетании с небольшой поддержкой синтаксиса). На самом деле все выполняется в одном потоке, но все это управляется асинхронным циклом ввода-вывода (построенным на вызове Unix select ), а стиль программирования позволяет писать код, который выглядит как прямой код (избегая большей части обычные накладные расходы кода на выполнение асинхронного ввода-вывода на многих других языках). Например:

lwt my_message = read_message socket in
let repsonse = compute_response my_message in
send_response socket response

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

9
ответ дан 2 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: