Если у вас есть функция, которая обрабатывает список, и вы хотите запустить ее в нескольких списках независимо, вы можете вызвать Thread.create
с этой функцией и каждым списком.Если вы храните свои списки в массиве part
, то:
let threads = Array.map (Thread.create (List.iter f)) part in
Array.iter Thread.join threads
Потоки INRIA OCaml не являются фактическими потоками: в каждый момент времени выполняется только один поток, что означает, что если у вас четыре процессора и четыре потока, всечетыре потока будут использовать один и тот же процессор, а остальные три останутся неиспользованными.
Где потоки полезны, так это то, что они по-прежнему допускают асинхронное программирование: некоторые примитивы модуля Thread
могут ждать, пока внешний ресурс станет доступным.Это может сократить время, затрачиваемое вашим программным обеспечением на заблокированный недоступный ресурс, потому что вы можете сделать так, чтобы другой поток в это время делал что-то другое.Вы также можете использовать это для одновременного запуска нескольких внешних асинхронных процессов (например, запрос нескольких веб-серверов через HTTP).Если у вас мало блокировок, связанных с ресурсами, это вам не поможет.
Что касается вопроса о разбиении списка: чтобы получить доступ к элементу списка, вы должны пройти все предыдущие элементы.,Хотя этот обход теоретически может быть разделен на несколько потоков или процессов, накладные расходы на связь, вероятно, сделают его намного медленнее, чем простое разделение элементов в одном процессе.Или используя массивы.