Parallélisme et Lambdas asynchrones: un acte d'équilibrage
Le traitement parallèle augmente considérablement les performances en distribuant des charges de travail sur plusieurs cœurs. Cependant, l'intégration des expressions de lambda asynchrones dans des boucles parallèles présente des défis uniques.
Le problème: tâches perdues
Considérez cet exemple:
var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, async item => { // Pre-processing var response = await GetData(item); bag.Add(response); // Post-processing }); var count = bag.Count; // count is often 0
Le count
reste fréquemment 0 car les threads d'arrière-plan de Parallel.ForEach
n'attendent pas que les opérations asynchrones se terminent. Une tentative naïve de résoudre ce problème:
var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, item => { // Pre-processing var responseTask = GetData(item); responseTask.Wait(); var response = responseTask.Result; bag.Add(response); // Post-processing }); var count = bag.Count;
Bien que cela garantit l'achèvement de la tâche, il annule les avantages de la programmation asynchrone en bloquant les threads et en exigeant une manipulation manuelle des exceptions.
Solutions efficaces
pour un traitement parallèle simple avec des lambdas asynchrones:
var bag = new ConcurrentBag<object>(); var tasks = myCollection.Select(async item => { // Pre-processing var response = await GetData(item); bag.Add(response); // Post-processing }); await Task.WhenAll(tasks); var count = bag.Count;
Cette approche crée une tâche pour chaque élément, permettant une exécution asynchrone. Task.WhenAll
s'assure que toutes les tâches se terminent avant de continuer.
Pour des scénarios plus complexes, le blog de Stephen Toub sur ForEachAsync
offre des techniques avancées et des meilleures pratiques. Cela fournit une solution plus robuste et efficace pour gérer les opérations asynchrones dans des boucles parallèles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!