Мне очень нравится концепция трубопровода/труб для применения операций с потоковым источником ввода-вывода. Мне интересно создавать инструменты, которые работают с очень большими файлами журнала. Одна из достопримечательностей перехода на Haskell из Python/Ruby - это более простой способ написания параллельного кода, но я не могу найти документацию об этом. Как я мог настроить поток канала, который считывает строки из файла и работает на них параллельно (т. Е. С 8 ядрами, он должен читать восемь строк и передавать их на восемь различных потоков, которые нужно обработать, а затем снова собирать и т. д.), в идеале с минимальной «церемонией», как это возможно ...Параллельная обработка в потоке трубопровода
Возможно, можно указать, должны ли линии соединяться по порядку или нет, если это может повлиять на скорость процесса?
Я уверен, что можно было бы что-то соблазнить собой, используя идеи из книги Parallel Haskell, но мне кажется, что выполнение чистой функции параллельно (parmap и т. Д.) В середине рабочего процесса Conduit должно быть очень легко?
В общем, концепция трубопроводов (и труб) предназначена для последовательного, а не параллельного. В частности, когда канал запрашивает ввод, только тогда его восходящий канал запускается для получения одного значения. Поэтому распараллеливать нечего. То, что вы можете сделать, - это создать канал, который находится во внутреннем распараллеливании - прием входных данных, планирование задач для их обработки и выход их. –
Я просто нахожу это странным, так как многие сторонники Haskell отмечают возрастающую важность многоядерных процессоров и как Haskell как чистый функциональный язык действительно сияет в этом отношении. И всякий раз, когда вы говорите о том, чтобы делать вещи с очень большими объемами данных в Haskell, кабелепровод и труба упоминаются как лучшие рамки. Поэтому я бы подумал, что распараллеливание обработки в трубе/трубопроводе должно быть «тривиальным» ... –
Существует два разных понятия: [параллелизм и параллелизм] (https://www.haskell.org/haskellwiki/Parallelism_vs. _Concurrency) (Я должен был сделать это различие более ясным в своем первом комментарии). Параллелизм естественен в чистых языках и не зависит от какой-либо структуры, вы просто запускаете несколько искры для вычисления чистых функций на нескольких ядрах, например, в канале. С другой стороны, параллелизм (многопоточность) является явным и недетерминированным и концептуально отличается от каналов/труб. –