
On Fri, Oct 27, 2023 at 07:43:07PM +0100, Tom Ellis wrote:
On Fri, Oct 27, 2023 at 11:36:53AM -0700, David Banas wrote:
What is the simplest way to translate a non-monadic line of Haskell code, such as:
res = map foo xs `using` parList rseq
For use in the IO monad?
This doesn’t work:
res <- mapM fooM xs `using` parTraversable rseq
The docs for Control.Parallel.Strategies say "The parallel tasks evaluated by a Strategy may have no side effects. For non-deterministic parallel programming, see Control.Concurrent."[1]. So I guess you should look into Control.Concurrent[2].
For a more friendly interface: https://hackage.haskell.org/package/async-2.2.4/docs/Control-Concurrent-Asyn... If the number of concurrent tasks is reasonably modest, a good fit could be `mapConcurrently`. For much larger numbers of tasks, it is best to run the jobs at a bounded concurrency, which may bring a BoundedChan to which the items to process are written, another to which results are written and a set of threads that do the processing, repeatedly reading more data until the channel is drained. *The* book on subject is: https://simonmar.github.io/pages/pcph.html -- Viktor.