56 votes

Dois-je utiliser ThreadPools ou Task Parallel Library pour les opérations liées à l'IO?

Dans un de mes projets qui sont un peu un agrégateur, je parse rss, les podcasts et donc à partir du web.

Si j'utilise l'approche séquentielle, étant donné qu'un grand nombre de ressources, il faut beaucoup de temps pour traiter tous d'entre eux (en raison de problèmes de réseau et les trucs similaires);

foreach(feed in feeds)
{
   read_from_web(feed)
   parse(feed)
}

Je tiens donc à mettre en œuvre la simultanéité et je ne pouvais pas décider si je dois utiliser ThreadPools de traiter avec les threads de travail ou simplement s'appuyer sur TPL pour faire un tri.

ThreadPools à coup sûr va gérer le travail pour moi avec les threads de travail et je vais obtenir ce que j'attends (et en multi-core CPU environnements, les autres cores seront également utilisées également).

concurrency

Mais j'ai encore envie d'envisager de TPL de trop car il est recommandé d'utiliser la méthode mais je suis un peu inquiète. Tout d'abord, je sais que TPL utilise ThreadPools mais ajoute une couche supplémentaire de prise de décision. Je suis surtout préoccupé de la condition que, si un single-core environnement est présent. Si je ne me trompe pas TPL commence avec un nombre de threads de travail égal au nombre de processeurs disponibles cœurs au tout début. Je n'ai peur de TPL produire des résultats similaires à l'approche séquentielle pour ma IO-lié de cas.

Donc, pour IO liée à l'exploitation (dans mon cas, la lecture de ressources à partir du web), est-il préférable d'utiliser ThreadPools et de contrôler les choses, ou mieux compter sur la TPL? Peut TPL également être utilisé dans les IO-tenu des scénarios?

Mise à jour: Ma principale préoccupation est que, sur un single-core CPU environnement TPL simplement se comporter comme approche séquentielle ou encore offrir la simultanéité? Je suis déjà à la lecture de la Programmation Parallèle avec Microsoft .NET et donc le livre , mais ne pouvait pas trouver une réponse exacte pour cela.

Note: ceci est une re-formulation de ma question précédente [ Est-il possible d'utiliser des thread-concurrency et le parallélisme ensemble? ] qui était très mal formulé.

80voto

HuseyinUslu Points 1700

J'ai donc décidé d'écrire des tests pour le présent et le voir sur la pratique des données.

Test De Légende

  • Itr: Itération
  • Seq: Approche Séquentielle.
  • PrlEx: Parallel Extensions Parallèles.ForEach
  • TPL: Task Parallel Library
  • TPool: ThreadPool

Des Résultats De Test

Single-Core CPU [Win7-32] -- tourne sous VMWare --

Test Environment: 1 physical cpus, 1 cores, 1 logical cpus.
Will be parsing a total of 10 feeds.
________________________________________________________________________________

Itr.    Seq.    PrlEx   TPL     TPool
________________________________________________________________________________

#1      10.82s  04.05s  02.69s  02.60s
#2      07.48s  03.18s  03.17s  02.91s
#3      07.66s  03.21s  01.90s  01.68s
#4      07.43s  01.65s  01.70s  01.76s
#5      07.81s  02.20s  01.75s  01.71s
#6      07.67s  03.25s  01.97s  01.63s
#7      08.14s  01.77s  01.72s  02.66s
#8      08.04s  03.01s  02.03s  01.75s
#9      08.80s  01.71s  01.67s  01.75s
#10     10.19s  02.23s  01.62s  01.74s
________________________________________________________________________________

Avg.    08.40s  02.63s  02.02s  02.02s
________________________________________________________________________________

Single-Core CPU [WinXP] -- tourne sous VMWare --

Test Environment: 1 physical cpus, NotSupported cores, NotSupported logical cpus.
Will be parsing a total of 10 feeds.
________________________________________________________________________________

Itr.    Seq.    PrlEx   TPL     TPool
________________________________________________________________________________

#1      10.79s  04.05s  02.75s  02.13s
#2      07.53s  02.84s  02.08s  02.07s
#3      07.79s  03.74s  02.04s  02.07s
#4      08.28s  02.88s  02.73s  03.43s
#5      07.55s  02.59s  03.99s  03.19s
#6      07.50s  02.90s  02.83s  02.29s
#7      07.80s  04.32s  02.78s  02.67s
#8      07.65s  03.10s  02.07s  02.53s
#9      10.70s  02.61s  02.04s  02.10s
#10     08.98s  02.88s  02.09s  02.16s
________________________________________________________________________________

Avg.    08.46s  03.19s  02.54s  02.46s
________________________________________________________________________________

PROCESSEUR Dual-Core [Win7-64]

Test Environment: 1 physical cpus, 2 cores, 2 logical cpus.
Will be parsing a total of 10 feeds.
________________________________________________________________________________

Itr.    Seq.    PrlEx   TPL     TPool
________________________________________________________________________________

#1      07.09s  02.28s  02.64s  01.79s
#2      06.04s  02.53s  01.96s  01.94s
#3      05.84s  02.18s  02.08s  02.34s
#4      06.00s  01.43s  01.69s  01.43s
#5      05.74s  01.61s  01.36s  01.49s
#6      05.92s  01.59s  01.73s  01.50s
#7      06.09s  01.44s  02.14s  02.37s
#8      06.37s  01.34s  01.46s  01.36s
#9      06.57s  01.30s  01.58s  01.67s
#10     06.06s  01.95s  02.88s  01.62s
________________________________________________________________________________

Avg.    06.17s  01.76s  01.95s  01.75s
________________________________________________________________________________

PROCESSEUR Quad-Core [Win7-64] -- HyprerThreading pris en charge --

Test Environment: 1 physical cpus, 4 cores, 8 logical cpus.
Will be parsing a total of 10 feeds.
________________________________________________________________________________

Itr.    Seq.    PrlEx   TPL     TPool
________________________________________________________________________________

#1      10.56s  02.03s  01.71s  01.69s
#2      07.42s  01.63s  01.71s  01.69s
#3      11.66s  01.69s  01.73s  01.61s
#4      07.52s  01.77s  01.63s  01.65s
#5      07.69s  02.32s  01.67s  01.62s
#6      07.31s  01.64s  01.53s  02.17s
#7      07.44s  02.56s  02.35s  02.31s
#8      08.36s  01.93s  01.73s  01.66s
#9      07.92s  02.15s  01.72s  01.65s
#10     07.60s  02.14s  01.68s  01.68s
________________________________________________________________________________

Avg.    08.35s  01.99s  01.75s  01.77s
________________________________________________________________________________

La synthèse de la

  • Si vous exécutez sur un single-core, de l'environnement ou d'un multi-core, Extensions Parallèles, TPL et ThreadPool se comporte de la même et donne des résultats approximatifs.
  • Encore TPL a des avantages comme facile la gestion des exceptions, l'annulation de soutien et de possibilité de revenir facilement les résultats des Tâches. Si Parallel Extensions est aussi une autre alternative viable.

L'exécution des tests sur votre propre

Vous pouvez télécharger les sources ici et d'exécuter sur-votre-propre. Si vous pouvez poster les résultats, je vais les ajouter également.

Mise à jour: correction du lien source.

15voto

Drew Marsh Points 22002

Si vous êtes en essayant de maximiser le débit d'ar-lié tâches que vous absolument devez combiner le traditionnel Asynchrone Modèle de Traitement (APM) Api avec votre TPL. L'APM Api sont le seul moyen de débloquer le thread CPU alors que l'asynchrone IO de rappel est en cours. Le TPL fournit l' TaskFactory::FromAsync méthode d'assistance pour les aider dans la combinaison de l'APM et de TPL code.

Consultez cette section de la .NET SDK sur MSDN droit TPL et Traditionnelle .NET la Programmation Asynchrone pour plus d'informations sur la façon de combiner ces deux modèles de programmation pour atteindre async nirvana.

2voto

Alois Kraus Points 6179

Vous avez raison que les TPL ne supprimer certains de la commande que vous avez lorsque vous créez votre propre pool de threads. Mais c'est seulement correct si vous ne voulez pas creuser plus profond. Le TPL ne vous permettent de créer des Tâches longues qui ne font pas partie de la TPL pool de threads et pourrait servir vos fins. Le livre, qui est un logiciel gratuit de lecture de la Programmation Parallèle avec Microsoft .NET vous donnera beaucoup plus de aperçu de la façon dont le TPL est destiné à être utilisé. Vous avez toujours la possibilité de donner Paralle.Pour, les Tâches explicites paramètres le nombre de threads doit être alloué. En plus de cela, vous pouvez remplacer le TPL planificateur avec votre propre si vous voulez un contrôle complet.

1voto

ehnmark Points 690

Vous pouvez affecter votre propre planificateur de tâches à une tâche TPL. Le travail par défaut qui en vole un est plutôt malin.

0voto

lukas Points 7789

Je n'ai peur de TPL produire des résultats similaires à l'approche séquentielle pour ma IO-lié de cas.

Je pense que ça va. Quel est le goulot d'étranglement? Est est l'analyse ou de les télécharger? Le Multithreading ne sera pas beaucoup vous aider avec téléchargement à partir du web.

Je voudrais utiliser Task Parallel Library pour le recadrage, l'application du masque ou des effets pour les images téléchargées, coupant quelques exemples de podcast etc. C'est plus évolutif.

Mais il ne sera pas l'ordre de grandeur de la vitesse. Dépenser vos ressources pour la mise en œuvre de certaines fonctionnalités, tests.

PS. "Wow ma fonction execustes à 0,7 s au lieu de 0,9" ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: