Accélérer la boucle en utilisant le multithreading en C# (Question)
Imaginer que j'ai une fonction qui passe par millions/milliards de cordes et de contrôles de qch.
f.ex:
foreach (String item in ListOfStrings)
{
result.add(CalculateSmth(item));
}
il consomme beaucoup de temps, parce que CalculateSmth est très coûteuse en temps de la fonction.
Je veux vous demander: comment intégrer le multithreading dans ce genre de processus?
f.ex: je veux l'incendie jusqu'à 5 fils, et chacun d'eux retourne des résultats, et des thats va-jusqu'à ce que la liste contient des éléments.
Peut-être que n'importe qui peut montrer des exemples ou des articles..
Oublié de mentionner que j'en ai besoin .NET 2.0
Avez-vous besoin que les résultats dans le même ordre?
Pourriez-vous utiliser plusieurs tâches en arrière-plan? créer une sorte de logique serait de prendre le comte de la liste des chaînes, puis créez un montant de X BWs et divy jusqu'chacun
Pourriez-vous utiliser plusieurs tâches en arrière-plan? créer une sorte de logique serait de prendre le comte de la liste des chaînes, puis créez un montant de X BWs et divy jusqu'chacun
OriginalL'auteur Lukas Šalkauskas | 2008-09-19
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer de le Parallel extensions (partie de .NET 4.0)
Ceux-ci vous permettent d'écrire quelque chose comme:
Bien sûr le résultat.ajouter devra être thread-safe.
résultat.ajouter doit être thread-safe ouais..
J'ai oublié de mentionner que j'en ai besoin .NET 2.0
Ok, eh bien, alors vous pouvez regarder le Parallèle.Foreach code source dans le réflecteur... même Si je crois qu'il y a toute une autre couche en dessous afin de ne pas être une simple copie de pâtes pour obtenir des fonctionnalités similaires .NET 2.0.
Parallel extensions sont maintenant une partie de .net 4.0, donc plus d'un CTP. 🙂
OriginalL'auteur Tobi
Parallel extensions est cool, mais cela peut aussi être fait en utilisant simplement le pool de threads comme ceci:
Pourrait avoir un ManualResetEvent que le WaitCallback les appels de fonction et le thread principal WaitOne.
Ajout de code pour montrer comment vous pouvez utiliser la MRE de le faire.
Qu'est-ce que WaitHandle.WaitAll ()? Je suis un NotSupportedException : "Le nombre de WaitHandles doit être inférieur ou égal à 64"
Vous générez plus de 64 threads... C'est probablement pas une bonne idée... 🙂 Essayez avec moins de threads.
OriginalL'auteur noocyte
Remarque que la simultanéité n'est pas comme par magie vous donner plus de ressources. Vous devez établir ce qui est le ralentissement de CalculateSmth vers le bas.
Par exemple, si c'est le CPU (et vous êtes sur un seul core) puis le même nombre de cycles de l'UC va aller pour le code, si vous exécuter séquentiellement ou en parallèle. De Plus, vous obtiendrez des frais généraux de la gestion des threads. Même argument s'applique à d'autres contraintes (par exemple, I/O)
Vous n'aurez qu'à obtenir des gains de performance dans cette si CalculateSmth est en laissant des ressources libres au cours de son exécution, qui pourraient être utilisés par une autre instance. Ce n'est pas rare. Par exemple, si la tâche consiste à IO suivie par certains CPU trucs, puis 1 pourrait faire l'UC trucs, même si le processus 2 est en train de faire l'OI. Comme tapis de points, une chaîne de producteur-consommateur unités peuvent atteindre cet objectif, si vous avez de l'infrastructure.
OriginalL'auteur slim
Vous devez diviser le travail que vous voulez faire en parallèle. Voici un exemple de comment vous pouvez diviser le travail en deux:
OriginalL'auteur Hallgrim
La première question que vous devez répondre est de savoir si vous devriez être en utilisant le filetage
Si votre fonction CalculateSmth() est fondamentalement lié au PROCESSEUR, c'est à dire lourd en CPU-utilisation et fondamentalement pas d'e/S d'utilisation, alors j'ai du mal à voir le point de l'utilisation de threads, car les threads seront en compétition sur la même ressource, dans ce cas, le PROCESSEUR.
Si votre CalculateSmth() est en utilisant à la fois le CPU et I/O, alors il pourrait être un point à l'aide du filetage.
Je suis totalement d'accord avec le commentaire de ma réponse. J'ai fait une supposition erronée que nous parlions d'une seule CPU avec un noyau, mais ces jours, nous avons les Processeurs multi-core, mon mauvais.
OriginalL'auteur Mats Wiklander
Pas que j'ai des bons articles ici et maintenant, mais ce que vous voulez faire, c'est quelque chose le long de Producteur-Consommateur avec un pool de threads.
Les Producteurs parcourt et crée des tâches (qui dans ce cas pourrait être à la file d'attente des éléments dans une Liste ou une Pile). Les Consommateurs sont, disons, cinq fils qui lit un article en dehors de la pile, il consomme par le calcul, puis la stocke ailleurs.
De cette façon, le multithreading est limité à seulement ceux de cinq fils, et ils ont tous un travail à faire jusqu'à ce que la pile est vide.
Choses à penser:
OriginalL'auteur Mats Fredriksson