Haskell предоставляет комбинатор par
, который ставит в очередь "искру" для возможной оценки параллельно с текущим потоком. Он также предоставляет комбинатор pseq
, который заставляет оценивать чистый код в определенном порядке.
Что, по-видимому, не предоставляет Haskell, это способ генерировать несколько искр, а затем ждать, пока все они закончатся. Это довольно тривиально для достижения с явным concurrency, но кажется невозможным с чистыми искрами.
Частично это возможно из-за предполагаемого варианта использования искр. Похоже, что они предназначены для спекулятивной оценки. То есть, выполняя работу, которая может потребоваться, но может и не быть. Следовательно, искры работают только на ядрах, которые в противном случае простаивают.
Однако это не мой случай использования. У меня есть куча результатов, которые, как мне известно, скоро понадобятся. И если я начну пытаться обработать результаты до того, как искры начнут стрелять, я просто закончу однопоточным снова с кучей испуганных искр.
Конечно, из par
ждал завершения искры, он не достигнет любого parallelism! Но было бы очень полезно, если бы какой-то способ произвести несколько искр, а затем дождаться их завершения. Я не могу найти способ сделать это, хотя.
Есть ли у кого-нибудь полезные предложения? (За исключением "явно использовать concurrency" ).