Я вообще не использовал многопоточность в Clojure, поэтому не знаю, с чего начать.
У меня есть doseq
, тело которого может работать параллельно. Я бы хотел, чтобы всегда выполнялось 3 потока (, оставляя 1 свободное ядро ), которые параллельно оценивают тело до тех пор, пока диапазон не будет исчерпан. Там нет разделяемого состояния, ничего сложного -, эквивалент многопроцессорной обработки в Python был бы вполне уместным.
Что-то вроде:
(dopar 3 [i (range 100)]
; repeated 100 times in 3 parallel threads...
...)
Где я должен начать искать? Есть ли команда для этого? Стандартный пакет? Хорошая ссылка?
До сих пор я нашел pmap
и мог бы использовать этот (, как мне ограничиться тремя за раз? похоже, что он использует 32 за раз-нет, в источнике написано 2 + количество процессоров ), но вроде как это базовый примитив, который где-то уже должен существовать.
уточнение:Я действительно хотел бы контролировать количество потоков. У меня есть процессы, которые долго -работают и используют приличный объем памяти, поэтому создавать большое количество и надеяться, что все будет хорошо, — не лучший подход (. пример, в котором используется значительная часть доступной памяти).
обновление:Начинаю писать макрос, который это делает, и мне нужен семафор (или мьютекс, или атом, который я могу ждать на ). Существуют ли семафоры в Clojure? Или я должен использовать ThreadPoolExecutor? Кажется странным, что нужно так много заимствовать из Java -Я думал, что параллельное программирование в Clojure должно быть легким... Может быть, я совершенно неправильно об этом думаю? Хм. Агенты?