2009-02-01 6 views
14

tout en apprenant une programmation de base avec python, j'ai trouvé web.py. Je suis resté bloqué avec un problème stupide:En utilisant web.py comme serveur http non bloquant

J'ai écrit une application de console simple avec une boucle principale qui traite les éléments à partir d'une file d'attente dans des threads séparés. mon but est d'utiliser web.py pour ajouter éléments à ma file d'attente et de signaler l'état de la file d'attente via une requête web. J'ai fonctionné comme un module mais je ne peux pas l'intégrer dans mon application principale. mon problème est quand je démarre le serveur http avec app.run() il bloque ma boucle principale . a également essayé de démarrer avec thread.start_new_thread mais il reste blocs. existe-t-il un moyen facile d'exécuter le serveur http intégré de web.py dans l'arrière-plan dans mon application.

en cas probable que je suis victime d'une fondamentale missunderstanding, toute tentative de clarifier mon erreur dans le raisonnement aide;.) (S'il vous plaît garder avec moi, je suis un débutant :-)

+0

Vous ne devriez pas répondre à la question. – iny

Répondre

6

J'ai trouvé une solution de travail. Dans un module séparé je crée mon serveur web:

import web 
import threading 
class MyWebserver(threading.Thread): 

    def run (self): 
     urls = ('/', 'MyWebserver') 
     app = web.application(urls, globals()) 
     app.run() 

    def POST ... 

Dans le programm principal je viens d'appeler

MyWebserver().start() 

et que d'aller avec tout ce que je veux, tout en ayant le serveur Web de travail en arrière-plan.

+3

J'ai des problèmes pour tuer ce programme avec Ctrl + C, quelqu'un d'autre peut-il confirmer? – puk

+0

Sachez que vous devrez peut-être ajouter l'initialisation de threading lors de l'initialisation de votre classe comme ceci: 'def __init __ (self): threading.Thread .__ init __ (self)'. – Kyr

1

ne serait pas plus simple est d'être à ré-écrire votre code-boucle principale pour une fonction que vous appelez encore et encore, puis appelez cela de la fonction que vous passez à runsimple ...

Il est garanti de ne pas satisfaire pleinement vos exigences, mais si vous êtes pressé, ce pourrait être le plus facile.

1

ou tout simplement utiliser Tornado, un serveur Web non-bloquant pour Python qui a une API similaire à webpy - http://www.tornadoweb.org/

+0

Pouvez-vous fournir un MWE, leur site n'est pas si bon – puk

0

J'ai également récemment utilisé Beanstalkd pour mettre en file d'attente des tâches qui seront exécutées dans un thread séparé. Votre gestionnaire web.py laisse tomber simplement un travail dans un tuyau et un script complètement séparé l'exécute. Vous pouvez avoir un nombre quelconque d'entre eux, et vous obtenez les avantages du contrôle de file d'attente avancé, etc.

Questions connexes