
Hi Bulat,
btw, if all that you need is to limit amount of simultaneous System.Cmd.system calls, you may go from opposite side: wrap this call into semaphore:
sem = unsafePerformIO$ newQSem numCapabilities
mysystem = bracket_ (waitQSem sem) (signalQSem sem) . system
and implement para as simple thread population:
para = mapM_ forkIO
My main motivation is to limit the number of system calls, but it's also useful from a user point of view if the system is doing a handful of things at a time - it makes it easier to track what's going on. I might try that tomorrow and see if it makes a difference to the performance. While the majority of computation is in system calls, quite a few of the threads open files etc, and having them all run in parallel would end up with way too many open handles etc. Thanks Neil