Mécanisme de planification de tâches

9

Click here to load reader

Transcript of Mécanisme de planification de tâches

Page 1: Mécanisme de planification de tâches

Mécanisme de planification de tâches Auteur: Ludovic COLLET

Page 2: Mécanisme de planification de tâches

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

Page 3: Mécanisme de planification de tâches

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)

Page 4: Mécanisme de planification de tâches

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

Page 5: Mécanisme de planification de tâches

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

Page 6: Mécanisme de planification de tâches

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

Page 7: Mécanisme de planification de tâches

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

Page 8: Mécanisme de planification de tâches

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.

Page 9: Mécanisme de planification de tâches

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