2010-02-09 12 views
5

Y at-il un moyen simple de faire async en Perl? J'ai la logique suivante pour une application Apache:Comment utiliser la programmation asynchrone en Perl?

get request 
process request 
write to log 
return 

ce que je veux faire est d'avoir le « écrire pour se connecter » partie être async, afin que je puisse faire la partie « retour » dès que possible.

+1

Pourquoi ne pas utiliser les appels non-bloquant pour gérer la partie écriture pour ouvrir une session de votre script? – daotoad

+0

Que voulez-vous dire par "Apache app"? mod_perl? CGI? PSGI? serveur Perl autonome avec Apache en tant que serveur frontal? – dolmen

Répondre

7

Malheureusement, cela implique généralement le cadre POE, mais il existe également une alternative croissante (que je voudrais essayer en premier) appelée AnyEvent. Pour plus d'informations sur l'apprentissage du POE, voir this question for learning materials. POE est un cadre et il a tendance à manger toute votre application. Il n'a pas non plus ressembler à comme Perl, et dépasse. Je crois que c'est une grande courbe d'apprentissage pour votre application typique.

AnyEvent est une simple suite de tâches asynchrones, vous devriez être capable de le comprendre assez bien avec les docs du CPAN.

Pour votre question spécifique que vous utilisez AnyEvent's AIO ou POE's Read Write wheel

+0

merci, se demandait si j'ai manqué quelque chose d'évident, mais n'en ai pas trouvé. Comme cela fait partie d'une application Apache, aucune des deux solutions ne semble intéressante. Merci le – Timmy

+2

vous pouvez utiliser un simple socket non-bloquant pour envoyer les données à un démon d'écriture de journal POE. Et, comme dit daotoad, tant que vous limitez un processus d'écriture par fichier alors vous pouvez probablement utiliser un handle non-bloquant –

+2

AnyEvent est également plus rapide et moins intrusif que POE. D'un ancien utilisateur POE lui-même, et maintenant un heureux utilisateur AnyEvent. – dolmen

3

vous pouvez utiliser les threads en Perl. créer un thread qui gère les journaux. ce thread aurait un tampon que le thread principal peut ajouter des messages

7

Envisager de regarder Coro.

De la documentation CPAN:

Contrairement aux soi-disant « fils Perl » (qui ne sont pas en fait des fils réels, mais seulement les fenêtres d'émulation de processus (voir la section du même nom pour plus de détails) portés à unix , et en tant que tels agissent en tant que processus), Coro fournit un espace d'adressage partagé complet, ce qui rend la communication entre les threads très facile. Et les threads de Coro sont rapides aussi: désactiver le code d'émulation de processus Windows dans votre Perl et utiliser Coro peut facilement entraîner une augmentation de la vitesse de deux à quatre fois pour vos programmes. Un benchmark de multiplication de matrice parallèle s'exécute plus de 300 fois plus vite sur un seul cœur que les pseudo-threads de Perl sur un quad core utilisant les quatre cœurs.

Ceci inclut Coro::AIO, une "E/S de fichiers et de répertoires vraiment asynchrone", qui pourrait être ce que vous cherchez.

6

Avez-vous vraiment besoin d'écrire les journaux avant de revenir?

En supposant que ce soit Apache mod_perl, il prend en charge les gestionnaires de nettoyage qui sont déclenchés pour le processus enfant après que la réponse est retournée.

Il semble que ce que vous voulez vraiment, c'est que la journalisation n'arrête pas le retour, les gestionnaires de nettoyage sembleraient le faire sans avoir besoin d'async du tout.

+0

Vous avez probablement raison, mais c'est un mauvais design en ce moment, et il en a besoin pour tirer profit du fait qu'il a certaines des données en ce moment, pas simplement une simple consignation. – Timmy

Questions connexes