Есть пара вещей, которые вы можете сделать.
Во-первых, поскольку здесь используется ThreadPool
, вы можете использовать ThreadPool.SetMaxThreads
.
Во-вторых, вы можете ввести свой собственный газ вместе сэти строки:
let throttle = makeThrottle(8)
array
|> Seq.map (fun item -> async { do! throttle.Wait()
return f item})
|> Async.Parallel
|> Async.RunSynchronously
makeThrottle()
не будет слишком трудным для написания, но это приведет к небольшим накладным расходам синхронизации.Если вы пытаетесь распараллелить так много вещей, что у вас не хватает памяти, перегрузка газа, скорее всего, не будет проблемой.(Дайте мне знать, если вам нужен пример для такого рода кода.)
Наконец, если это действительно сбой, это пахнет, как будто вы делаете что-то не так.ThreadPool
обычно (но не всегда) хорошо справляется с управлением.Но в различных обстоятельствах разработка собственного дросселя в любом случае может оказаться полезной для вашего приложения.