Size: a a a

Clojure — русскоговорящее сообщество

2020 November 05

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Ну да, только mapv кажется как будто не для этой задачи придуман
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
В голове хочется просто map сделать
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Да собственно вот у меня пример параллельных запросов :)
Вообще я собирался doall поставить после первого мапа, тогда вроде правильно должно сработать
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Ну вот и как идиоматично все сразу запустить?)
если не сильно задумываясь, то можно pmap

а вообще зависит от того, что у тебя за коллекция такая, и сколько в ней элементов
http/get тоже тебе 1000 запросов сразу не будет делать наружу
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Sergey Trofimov
если не сильно задумываясь, то можно pmap

а вообще зависит от того, что у тебя за коллекция такая, и сколько в ней элементов
http/get тоже тебе 1000 запросов сразу не будет делать наружу
Ну мне нужно около 100 :)
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Вообще я собирался doall поставить после первого мапа, тогда вроде правильно должно сработать
ну, mapv будет быстрее
и вообще doall не место в нормальном коде
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Кстати, я так и не понял, почему Рич решил, что ленивый map это хороший дефолт?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Ну мне нужно около 100 :)
ну я сам так и писал, где мне нужно было 😊
      (->> messages
       (mapv #(future (send-message %)))
       (mapv deref))
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Ладно, надо значит утилитки начинать колбасить
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Кстати, я так и не понял, почему Рич решил, что ленивый map это хороший дефолт?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Ну вот и как идиоматично все сразу запустить?)
но вообще я бы использовал, наверное, core.async/pipeline с контролируемым параллелизмом
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Спасибо за советы)
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
но вообще я бы использовал, наверное, core.async/pipeline с контролируемым параллелизмом
выглядит, конечно, уже не так изящно
  (time (let [from (->> (list 1 2 3) (async/to-chan!))
             to (async/chan)
             xf (map #(deref (future (Thread/sleep 1000) %)))]
         (async/pipeline-blocking 10 to xf from true)
         (async/<!! (async/into [] to))))
"Elapsed time: 1007.2854 msecs"
=> [1 2 3]
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
выглядит, конечно, уже не так изящно
  (time (let [from (->> (list 1 2 3) (async/to-chan!))
             to (async/chan)
             xf (map #(deref (future (Thread/sleep 1000) %)))]
         (async/pipeline-blocking 10 to xf from true)
         (async/<!! (async/into [] to))))
"Elapsed time: 1007.2854 msecs"
=> [1 2 3]
ну а в случае асинхронного апи от http можно использовать pipeline-async без deref и оформить как функцию, которая берёт коллекцию, асинхронную функцию над элементом, параллелизм — и возвращает уже обработанную коллекцию, над элементами которой уже производятся синхронные операции
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
ну а в случае асинхронного апи от http можно использовать pipeline-async без deref и оформить как функцию, которая берёт коллекцию, асинхронную функцию над элементом, параллелизм — и возвращает уже обработанную коллекцию, над элементами которой уже производятся синхронные операции
в таком виде не будут создаваться дополнительные треды для параллельной обработки
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Вот кажется как будто не хватает функций в стандартной библиотеке)
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
но их в целом несложно самому написать
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
Mikhail Borisov
Кстати, я так и не понял, почему Рич решил, что ленивый map это хороший дефолт?
Видимо он хорошо сочетается с другими ленивыми преобразованиями
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
Делаешь map, потом например take
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Ну в таком контексте понятно, но это кажется игрушкой
источник