Я хочу объединить несколько значений ввода-вывода, которые должны выполняться независимо в
параллельны друг другу.
То, как я это вижу, чтобы выяснить, «когда я использую что?», Нам нужно вернуть старую параллельную и параллельную дискуссию , которая в основном сводится к (цитируя принятые ответ):
Параллельность - это когда две или более задач могут запускаться, запускаться и завершаться в
перекрывающиеся периоды времени. Это не обязательно означает, что они когда-либо
оба будут работать одновременно . Например, многозадачность на
одноядерный станок.
Параллелизм - это когда задачи в буквальном смысле выполняются одновременно, например, на
многоядерный процессор.
Нам часто хотелось бы привести пример параллелизма, когда мы выполняем операции, подобные вводу-выводу, такие как создание беспроводного вызова или разговор с диском.
Вопрос в том, какой из них вы хотите, когда говорите, что хотите выполнить «параллельно», это первый или второй?
Если мы ссылаемся на первое, то использование Concurrent[F]
передает намерение по сигнатуре и обеспечивает правильную семантику выполнения. Если это последнее, и мы, например, хотим обрабатывать набор элементов параллельно, то лучше было бы использовать Parallel[F, G]
.
Часто это довольно запутанно, когда мы думаем о семантике этого относительно IO
, потому что у него есть оба экземпляра для Parallel
и Concurrent
, и мы в основном используем его для непрозрачного определения побочных эффектов.
В качестве примечания, причина, по которой Parallel
принимает два конструктора унарного типа, заключается в том, что M
(в Parallel[M[_], F[_]]
) всегда в экземпляре Monad
, и нам нужен способ доказать Monad также имеет экземпляр Applicative[F]
для параллельных выполнений, потому что когда мы думаем о Monad, мы всегда говорим о семантике последовательного выполнения.