En ratant son coup autour avec quelques F # (via MonoDevelop), je l'ai écrit une routine qui énumère les fichiers dans un répertoire avec un fil:me aider à raisonner sur F fils #
let rec loop (path:string) =
Array.append
(
path |> Directory.GetFiles
)
(
path
|> Directory.GetDirectories
|> Array.map loop
|> Array.concat
)
Et puis une version asynchrone de celui-ci:
let rec loopPar (path:string) =
Array.append
(
path |> Directory.GetFiles
)
(
let paths = path |> Directory.GetDirectories
if paths <> [||] then
[| for p in paths -> async { return (loopPar p) } |]
|> Async.Parallel
|> Async.RunSynchronously
|> Array.concat
else
[||]
)
Sur les petits répertoires, la version asynchrone fonctionne correctement. Sur les plus gros répertoires (par exemple, plusieurs milliers de répertoires et de fichiers), la version asynchrone semble se bloquer. Qu'est-ce que je rate? Je sais que la création de milliers de threads ne sera jamais la solution la plus efficace - je n'ai que 8 processeurs - mais je suis déconcerté que pour les plus gros répertoires la fonction asynchrone ne répond pas (même après une moitié heure). Cependant, cela n'échoue pas visiblement, ce qui me déroute. Y a-t-il un pool de threads qui est épuisé?
Comment ces threads fonctionnent-ils réellement?
Edit:
Selon this document:
Mono> = 2.8.x a une nouvelle threadpool qui est beaucoup, beaucoup plus difficile à une impasse. Si vous obtenez une impasse threadpool, il y a des chances que votre programme tente d'être bloqué.
: D
ressemble à une impasse ..... –
WRT à un blocage, c'est très probable. Considérez le cas où pour terminer le dossier du dossier B, vous devez ajouter des threads X au pool de threads. Cependant, cela est bloqué jusqu'à ce que les threads précédents soient terminés; sauf qu'ils sont bloqués en ayant besoin de générer plus de threads dans le pool de threads ... –
Pour les stacktraces gérés d'un programme bloqué $ PID, "kill -QUIT $ PID" et vérifiez la sortie de la console du programme. Pour les stacktraces natifs, "gdb attach $ PID" puis "t a a bt". –