Параллельная дозаq для Clojure

Я вообще не использовал многопоточность в Clojure, поэтому не знаю, с чего начать.

У меня есть doseq, тело которого может работать параллельно. Я бы хотел, чтобы всегда выполнялось 3 потока (, оставляя 1 свободное ядро ​​), которые параллельно оценивают тело до тех пор, пока диапазон не будет исчерпан. Там нет разделяемого состояния, ничего сложного -, эквивалент многопроцессорной обработки в Python был бы вполне уместным.

Что-то вроде:

(dopar 3 [i (range 100)]
  ; repeated 100 times in 3 parallel threads...
 ...)

Где я должен начать искать? Есть ли команда для этого? Стандартный пакет? Хорошая ссылка?

До сих пор я нашел pmapи мог бы использовать этот (, как мне ограничиться тремя за раз? похоже, что он использует 32 за раз-нет, в источнике написано 2 + количество процессоров ), но вроде как это базовый примитив, который где-то уже должен существовать.

уточнение:Я действительно хотел бы контролировать количество потоков. У меня есть процессы, которые долго -работают и используют приличный объем памяти, поэтому создавать большое количество и надеяться, что все будет хорошо, — не лучший подход (. пример, в котором используется значительная часть доступной памяти).

обновление:Начинаю писать макрос, который это делает, и мне нужен семафор (или мьютекс, или атом, который я могу ждать на ). Существуют ли семафоры в Clojure? Или я должен использовать ThreadPoolExecutor? Кажется странным, что нужно так много заимствовать из Java -Я думал, что параллельное программирование в Clojure должно быть легким... Может быть, я совершенно неправильно об этом думаю? Хм. Агенты?

16
задан Community 23 May 2017 в 11:59
поделиться