Mécanisme de planification de tâches
Click here to load reader
-
Upload
novencia-groupe -
Category
Documents
-
view
1.205 -
download
0
Transcript of Mécanisme de planification de tâches
Mécanisme de planification de tâches Auteur: Ludovic COLLET
Objectif
Exécuter des tâches l'une après l'autres dans un service Windows. Les tâches se mettront en file d'attente dans le cas où une tâche est déjà en cours d'exécution.
Use Case:
Un utilisateur doit pouvoir exécuter des taches au travers d'un site Asp .net
TPL
C'est une librairie qui permet de mettre en place simplement des mécanismes asynchrones. Task Parrallel Library
Incluant les namespaces System.Threading et System.Threading.Tasks.
Je ne vais rentrer dans les détails de la TPL.
Juste la base pour le lancement de tâches:
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - [email protected] 2
Par contre dans le cas ci-dessus les taches vont s'exécuter en même temps.
L'output donnera ceci :
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - [email protected] 3
C'est là qu'entre en jeu l'utilisation de tache planifiées (Scheduling task)
Taches Planifiées
Par défaut, la TPL (aussi Plinq) , utilise le .NET Framework ThreadPool.
C'est là qu'entre en jeu l'utilisation de tache planifiées (Scheduling task)
Par défaut, la TPL (aussi Plinq) , utilise le .NET Framework ThreadPool.
Les taches sont exécutées par des threads worker (leurs nombres maximum dépendent de la machine). Ils récupèrent les taches à partir du threadPool et les exécutent. Si tous les threadWorker sont occupés alors les nouvelles tâches sont laissées dans la file d'attente globale du threadPool.
Il existe une file d'attente globale et des files d'attentes locales propres à chaque tâche.
Mais ces planifications peuvent être largement étendues grâce à la possibilité d'extension de la classe abstraite TaskScheduler , qui peut être dérivée pour implémenter des algorithmes de planification personnalisés, comme ce qui est fait dans la librairie Parrallel Extensions Extra
Infos:
A propos de la file d'attente globale et locale du Thread Pool je vous conseille ces deux articles :
Task Scheduler MSDN
Work-Stealing
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - [email protected] 4
Parallel Extensions Extras
La librairie est disponible ici.
Dans les différents projets il y a ParrallelExtensionExtras.
Elle est développée par l'équipe qui s'occupe de la parallélisassions chez Microsoft, notamment Stephen Toub.
PEE a beaucoup de fonctionnalités différentes, sur ce billet on s'arrêtera juste sur les TaskScheduler. Et plus précisément sur :
OrderedTaskScheduler QueuedTaskScheduler
OrderedTaskScheduler
C'est une variante plus basique du QueuedTaskScheduler.
Elle n'a qu'une fonction : mettre en file d'attente les différentes tâches assignées.
Pas de multi threading.
Elle m'a servit à mettre en place en quelques ligne de code un système de mise en file d'attente efficace.
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - [email protected] 5
Voyons un peu le code:
Et donc grâce à notre TaskScheduler , contrairement au premier exemple, Les tâches sont mises en attente et exécuter l'une après l'autre.
L'output donnera ceci :
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - [email protected] 6
On remarque aussi que ce TaskScheduler n'utilise q'un seul thread worker.
Donc très facilement en quelque lignes de codes on peut mettre en place un système de file d'attente qui pourrait être particulièrement utile dans l'exécution de différente tâches utilisateur (Chargement de données, Différents traitements sur les données…)
Mais voilà ça ne me suffit pas je veux pouvoir prioriser des tâches.
QueuedTaskScheduler
Pour pouvoir prioriser les taches nous allons utiliser la classe QueuedTaskScheduler.
Priorisation :
Code :
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - [email protected] 7
Toutes les tâches assignées au scheduler pri0 seront priorisées.
L'output donne cela :
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - [email protected] 8
On voit bien la priorité donné aux tâches High. On remarque aussi dans le constructeur le paramètre threadCount. En Effet ce TaskScheduler est multiThread et on peut lui préciser sur combien de niveau. Pour l'exemple je l'ai rendu MonoThread avec qu'une seule exécution possible. Si aucun paramètre n'est passé il prendra par défaut les capacités de la machine.
Conclusion
Comme on a pu le voir, Il existe des librairies puissantes qui nous permettent de mettre en place des systèmes complexes très facilement.
On peut très bien imaginer utiliser ces fonctionnalités dans un service Windows qui exécuterait des tâches envoyées par des clients externes.
Il y a encore beaucoup de fonctionnalités disponibles, notamment avec le QueuedTaskScheduler.
A vous de les découvrir.
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - [email protected] 9