2011-09-24 3 views
3

J'écris actuellement un petit framework pour les workflows basés sur la demande. L'API est maintenant stable et je travaille à améliorer les tests. Il est facile de montrer que les calculs sont corrects (ce qui est un bon début), cependant, l'intérêt principal du framework est de lancer des sous-tâches en parallèle (si nécessaire et possible).Test de l'exécution simultanée/parallèle

Existe-t-il un moyen de tester automatiquement que deux parties de code différentes fonctionnent de manière parallèle/simultanée? Je préfère ne pas compter sur des mesures de temps d'exécution (accélération).

Le framework est écrit en scala, et repose beaucoup sur Akka Futures.

EDIT:

est un exemple:

val foo = step { 
    //... defines an arbitrary task 
} 

// Runs 5 times the code inside step foo 
val foos = repeat(5)(foo) 

Je voudrais être sûr que le code à l'intérieur foo est exécuté 5 fois en parallèle.

Répondre

2

Je ne vois pas un moyen de le faire sans changer de tâches (c'est-à-dire lorsque vous devez tester que deux tâches spécifiques s'exécutent en parallèle). Mais si vous pouvez changer les tâches, ajoutez simplement un acteur au système. Faites en sorte que chaque tâche envoie des messages à cet acteur au début ou à la fin du travail. Si l'acteur reçoit deux messages Starting d'affilée, les tâches doivent être exécutées en parallèle (ou au moins dans des threads différents).

+0

J'aime l'idée, mais êtes-vous sûr de l'ordre absolu des messages dans la boîte aux lettres d'acteur? – paradigmatic

+0

@paradigmatic: http://akka.io/docs/akka/snapshot/scala/actors.html ne semble rien dire sur la commande, malheureusement, y compris les garanties que je m'attends à ce que toute implémentation d'acteur à fournir. –

+2

Vous pouvez simplement utiliser les horodatages dans les messages, puis alignez les messages sur les horodatages à la fin du test et créez une "chronologie des événements" .. – tuxSlayer

1

Ce test n'a aucun sens pour moi. Sur un ordinateur avec moins de 5 cœurs, vous ne pouvez pas obtenir un parallélisme de 5. Il semble que vous testiez Akka, ce que nous faisons déjà, alors détendez-vous et testez les paramètres du répartiteur pour vérifier que quand il fonctionnera, il aura le effet.

Espoir qui aide,

Cheers, √

+1

Je n'essaie pas de tester si les régulateurs Akka fonctionnent, mais plutôt si je pouvais Commencer la tâche et combiner les futurs correctement. J'ai présenté quelques bogues qui ont fait du code séquentiel et je veux être sûr que cela n'arrivera plus jamais. (BTW: machines avec plus de 4 noyaux ne sont pas rares ces jours) – paradigmatic

+0

Alors peut-être la question est mal posée, comment avez-vous fait le code séquentiel? –

+0

En combinant des contrats à terme avec 'flatMap' sans avoir préalablement déclenché l'exécution (c'est-à-dire des contrats à terme créés à l'intérieur pour la compréhension). Je veux éviter ce genre d'erreur. – paradigmatic

Questions connexes