2008-09-17 11 views
2

J'ai un script Perl que j'essaye de configurer en utilisant Perl Threads (utiliser des threads). Quand je lance des tests simples tout fonctionne, mais quand je fais mon script réel (qui a les threads exécutant plusieurs sessions SQL Plus), chaque session SQL Plus s'exécute dans l'ordre (ie sqlplus du thread 1 exécute les étapes 1-5, puis thread Sqlplus de 2 exécute les étapes 6-11, etc.). Je pensais avoir compris que les threads feraient un traitement simultané, mais quelque chose ne va pas. Des idées, ou devrais-je faire une autre magie Perl?Puis-je exécuter Perl ithreads sous Windows simultanément?

+0

Je, et je suppose que d'autres, sont curieux d'entendre un peu de suivi sur cette question. Avez-vous trouvé une solution? Les réponses étaient-elles utiles ici? – Frosty

+0

Qu'est-ce que Frosty a dit ... Quel était le problème? –

Répondre

4

Quelques explications possibles:

  1. Courez-vous ce script sur un processeur multi-core ou machine multi-processeur? Si vous n'avez qu'un seul processeur, un seul thread peut l'utiliser à tout moment.

  2. Y a-t-il des transactions ou des verrous impliqués dans les étapes 1 à 6 qui empêcheraient que cela se fasse simultanément? Etes-vous certain d'utiliser plusieurs connexions à la base de données et de ne pas en partager une seule entre les threads?

+0

Il n'y avait qu'une seule connexion DB, ce qui n'était pas ce à quoi je m'attendais. Merci pour l'idée (je n'ai jamais pensé à vérifier ça), maintenant j'ai du travail à faire ... – Milner

2

En fait, vous n'avez aucun moyen de garantir dans quel ordre les threads vont s'exécuter. Donc, le comportement (si ce n'est pas ce que vous attendez) n'est pas vraiment faux.

Je suppose que vous avez une sorte de synchronisation qui se passe ici. Peut-être que SQL * Plus ne se laisse appeler qu'une seule fois? Certains programmes font que ...

Autres possiblilties:

  • création de fil et la création de processus (vous sont pour créer des sous-processus SQL * Plus, n'êtes-vous pas?) Prendre plus que de courir le fil , donc le thread 1 est terminé avant même que le thread 2 ne démarre

  • Vous utilisez des transactions dans vos scripts SQL qui forcent la synchronisation des mises à jour de base de données.

1

Vérifiez vos paramètres de base de données. Vous pouvez trouver qu'il est mis en place de manière conservatrice. Cela entraînerait même des lectures mineures pour bloquer tout accès à cette information.

Vous pouvez également appeler le threads::yield.

Questions connexes