С одной стороны, во многих местах пишут о том, что есть многопоточность, но нет параллелизма (т. е. многопоточное приложение занимает всегда лишь одно ядро, постоянно переключая контекст):
Lack of parallelism. OCaml does not offer any primitives for parallelism through multithreading. In many cases, this does not affect us because we tend to distribute work between independent processes. But when large in-process caches are needed, it results in high memory pressure. This can only be alleviated by sharing the caches between processes, which is cumbersome and greatly affects code architecture. Having multithreading primitives could let us explore a more diverse range of architectures when developing services.
Отсюда: http://engineering.issuu.com/2015/09/17/ocaml-production.html
С другой стороны, модуль Thread
реализован через POSIX threads, и непонятно, откуда указанное выше ограничение:
- http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora175.html
- https://ocaml.github.io/ocamlunix/threads.html
В-третьих, есть нестандартные модули multicore и async, существование которых как бы намекает, что с многопоточностью (вернее, таки параллелизмом) в стандартной библиотеке не всё гладко. Но сами пресловутые модули, похоже, в состоянии перманентной беты.
Наконец, интересно, как это всё соотносится с экосистемой F#, у которого на Mono есть вся мощь CLR, а реализация пи этом наверняка опирается на те же pthreads.
Кто проконсультирует?