2009-02-24 6 views
3

J'ai deux requêtes Web que je dois interroger pour savoir quand elles reviennent. Idéalement, je ne veux pas continuer à les tester en boucle. Je voudrais libérer le CPU pour que d'autres processus puissent s'exécuter.Comment puis-je interroger les requêtes Web sans bloquer?

J'utilise actuellement la fonction Perl Time :: HiRes :: sleep (0.100) pour libérer le processeur avant de tester si les requêtes Web sont retournées ou non.

Lors des tests en charge, je peux voir que la durée de sommeil 'étire'. Idéalement, je veux m'assurer que la durée du sommeil est respectée mais que le processeur est libéré. Dois-je appeler une fonction différente pour y parvenir?

Je suis en train de coder Perl sous Linux 2.6.

Répondre

14

Plutôt que d'interroger, vérifiez si vous ne pouvez pas obtenir les descripteurs de fichier et effectuer un appel de sélection.

Ensuite, vous reprendrez le contrôle dès que quelque chose se passera, sans occuper le processeur du tout.

Quelque part dans la requête Web seront des sockets, et attachés aux sockets seront des descripteurs de fichier que vous pouvez utiliser dans select.

Dans tous les cas, votre programme peut être interrompu à tout moment pendant un certain temps; Si c'est un vrai problème, vous avez besoin d'un système d'exploitation en temps réel, mais comme vous avez affaire à des requêtes Web, je doute que vous ayez besoin de ce niveau de réactivité.

En fait ce que vous voulez est une interface de haut niveau qui fait l'appel de sélection pour vous. Comme suggéré dans les commentaires: http://search.cpan.org/dist/HTTP-Async/ ressemble à ce qu'il fera exactement ce dont vous avez besoin.

+0

C'est ce que HTTP :: Async fait sous le capot - jetez un oeil au code pour voir comment cela est fait: http://search.cpan.org/dist/HTTP-Async/ – EvdB

+0

C'est précisément ce que je signifiait. –

1

Je ne pense pas que la durée du sommeil puisse être garantie sur Linux standard. C'est à peu près le point d'un système d'exploitation "temps réel", et Linux n'est pas "temps réel".

Je suis d'accord avec @Douglas Leeder: utilisez un appel select pour que le noyau vous avertisse lorsque quelque chose change. Vous pouvez également émuler des sous-sessions de seconde avec un appel sélectif, mais Time :: HiRes est une interface plus propre (et vous n'allez toujours pas éviter d'allonger l'attente).

2

On dirait que vous voulez vraiment une boucle d'événements. Il y a POE, EV, et abstraction layers over both.

De toute façon, ne l'implémentez pas vous-même. Cette roue a déjà été inventée .

Questions connexes