Hay un par de cosas que puede hacer.
En primer lugar, ya que este usa el ThreadPool
, puede usar ThreadPool.SetMaxThreads
.
En segundo lugar, se puede introducir su propia aceleración a lo largo de estas líneas:
let throttle = makeThrottle(8)
array
|> Seq.map (fun item -> async { do! throttle.Wait()
return f item})
|> Async.Parallel
|> Async.RunSynchronously
makeThrottle()
no sería demasiado difícil escribir, pero sería incurrir en una pequeña sobrecarga de sincronización. Si intentas paralelizar tantas cosas que te estás quedando sin memoria, es probable que la aceleración del acelerador no sea un problema. (Avíseme si necesita una muestra para este tipo de código.)
Finalmente, si esto realmente está estropeando las cosas, huele como si estuviera haciendo algo mal. El ThreadPool
normalmente (pero no siempre) hace un buen trabajo gestionándose solo. Pero en diversas circunstancias, diseñar su propio acelerador puede ser valioso para su aplicación de todos modos.
Estoy confundido por esto. Tenía la impresión de que F # utilizaba algún tipo de grupo de subprocesos con una limitación de recuento de procesador. ¿No es verdad? –
Como Zan mencionó anteriormente, creo que Async funciona con un grupo de subprocesos que tiene un límite superior. ¿Estás seguro de que el problema no está dentro de 'f'? – Paul
Luego surge la pregunta: ¿se puede establecer el límite superior en la membresía de ese grupo de subprocesos manualmente? – Alexander