Système.Le filetage.Tâches - Limiter le nombre de Tâches simultanées
J'ai juste commencé à regarder le nouveau Système".Le filetage.Les tâches de" la bonté .Net 4.0, et voudrais savoir si il y a une génération à l'appui de limiter le nombre de tâches simultanées qui s'exécutent à la fois, ou si cela doit être traité manuellement.
E. G: Si j'ai besoin d'appeler une méthode de calcul de 100 fois, est-il un moyen de mettre en place 100 Tâches, mais ont seulement 5 exécuter simultanément? La réponse vient peut-être de créer des 5 tâches, appelez Tâche.WaitAny, et de créer une nouvelle Tâche comme chaque précédente se termine. Je veux juste m'assurer que je ne suis pas en manque un truc, si il y a une meilleure façon de le faire.
Fondamentalement, est-il intégré dans la façon de le faire:
Dim taskArray() = {New Task(Function() DoComputation1()),
New Task(Function() DoComputation2()),
...
New Task(Function() DoComputation100())}
Dim maxConcurrentThreads As Integer = 5
RunAllTasks(taskArray, maxConcurrentThreads)
Merci pour toute aide.
- Pourriez-vous expliquer pourquoi vous devez vous limiter à 5? Notez que le planificateur de tâches ne démarre pas tous les 100 dans le même temps, il utilise le pool de threads en interne (ou le pool de threads utilise le système des tâches) donc il va limiter le nombre de tâches simultanées à quelque chose de petit, mais ça pourrait changer, et il pourrait être lié au nombre de cœurs dans votre système, mais le fait de savoir pourquoi vous souhaitez limiter à un nombre précis peuvent donner quelques bonnes réponses.
- Le calcul fait les appels d'un webservice dans le cadre de son opération. Ce n'est écrasante le webservice. 5 est juste un exemple.
- Comment Parallèles? stackoverflow.com/questions/5009181/...
Vous devez vous connecter pour publier un commentaire.
Je sais que c'est presque un an, mais j'ai trouvé un moyen beaucoup plus facile de parvenir à cela, j'ai donc pensé que je voudrais partager:
Voila!
Je sais que c'est un vieux thread, mais je voulais juste partager ma solution à ce problème: l'utilisation des sémaphores.
(C'est en C#)
Une solution pourrait être de prendre un coup d'oeil à la pré-faites de code à partir de Microsoft ici.
La description qui va comme ceci: "Fournit un planificateur de tâches qui assure un maximum de niveau de simultanéité lors de l'exécution sur le dessus du pool de threads.", et aussi loin que j'ai pu tester, il semble faire l'affaire, de la même manière que le MaxDegreeOfParallelism propriété dans ParallelOptions.
C# équivalent de l'échantillon fourni par James
Réponse courte: Si ce que vous voulez est de limiter le nombre de travailleurs tâches, de manière à ne pas saturer votre service web, alors je pense que votre approche est très bien.
Réponse longue: Le nouveau Système.Le filetage.Tâches moteur .NET 4.0 fonctionne sur la .NET pool de threads. Depuis il n'est jamais un pool de threads par processus et par défaut à un maximum de 250 threads de travail. Par conséquent, si vous définissez le pool de threads du nombre maximal de threads à une plus modeste, vous pouvez être en mesure de réduire le nombre d'simultanément l'exécution de threads, et donc des tâches à l'aide de la
ThreadPool.SetMaxThreads (...)
API.TOUTEFOIS, notez que vous pouvez très bien ne pas être le seul à utiliser le pool de threads que de nombreux autres classes que vous utilisez peut également les éléments de la file d'attente pour le pool de threads. Par conséquent, il ya une bonne chance que vous pourriez finir par affaiblir le reste de votre application en faisant cela. Notez également que, parce que le pool de threads emploie un algorithme pour optimiser son utilisation d'une machine sous-jacente de carottes, de limiter le nombre de threads du pool de threads peut file d'attente pour un arbitrairement faible nombre peut entraîner dans certains assez catastrophique des problèmes de performances.
Encore une fois, si vous voulez exécuter un petit nombre de travailleurs tâches/threads pour l'exercice de certaines tâches, puis seulement à la création d'un petit nombre de tâches (contre 100) est la meilleure approche.
Mon blog montre comment faire les deux avec les Tâches et les Actions, et fournit un exemple de projet que vous pouvez télécharger et de l'exécuter pour voir à la fois dans l'action.
Avec Des Actions
Si à l'aide d'Actions, vous pouvez utiliser le microphone .Net Parallèle.Appeler la fonction. Ici nous limiter à l'exécution d'au plus 5 threads en parallèle.
Avec Des Tâches
Puisque vous êtes à l'aide de Tâches ici cependant, il n'existe pas de fonction intégrée. Toutefois, vous pouvez utiliser celui que j'sur mon blog.
Et puis la création de votre liste de Tâches et l'appel de la fonction à les exécuter, à dire un maximum de 5 simultanée à un moment, vous pourriez faire ceci:
StartAndWaitAllThrottled
méthode. Comment voulez-vous modifier le code actuel?Il ne ressemble pas à ça, même si vous pouvez créer une sous-classe de
TaskScheduler
qui implémente un tel comportement.Si votre programme utilise des webservices nombre de connexions simultanées sera limitée à
ServicePointManager.DefaultConnectionLimit
de la propriété. Si vous voulez 5 connexions simultanées, il ne suffit pas d'utiliser Arrow_Raider de la solution. Vous devez également augmenterServicePointManager.DefaultConnectionLimit
car il est à seulement 2 par défaut.