2009-02-01 14 views
14

mientras aprendía algo de programación básica con python, encontré web.py. i quedé atrapado con un problema estúpida:Usando web.py como servidor HTTP que no bloquea

escribí una aplicación de consola simple con un bucle principal que proccesses artículos de una cola en hilos separados. Mi objetivo es usar web.py para agregar elementos a mi cola e informar el estado de la cola a través de la solicitud web. i tengo esto funcionando como un módulo pero no puedo integrarlo en mi aplicación principal. mi problema es cuando inicio el servidor http con app.run() bloquea mi lazo principal . también intentó iniciarlo con thread.start_new_thread pero aún así bloques. hay una manera fácil de ejecutar el servidor http integrado de web.py en el fondo dentro de mi aplicación.

en el probable caso de que soy una víctima de un malentendido fundamental , cualquier intento de aclarar mi error en el razonamiento haría ayuda;.) (Por favor tengan paciencia conmigo, soy un principiante :-)

+0

No debe responder en la pregunta. – iny

Respuesta

6

encontré una solución de trabajo. En un módulo separado i crear mi servidor web:

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

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

    def POST ... 

en el Programm principal acabo de llamar

MyWebserver().start() 

y de seguir con lo que quiera mientras que el servidor web de trabajo en el fondo.

+3

Tengo problemas para matar este programa con Ctrl + C, ¿alguien más puede confirmarlo? – puk

+0

Tenga en cuenta que es posible que tenga que agregar la inicialización del subprocesamiento durante la inicialización de su clase de esta manera: 'def __init __ (self): threading.Thread .__ init __ (self)'. – Kyr

1

No sería más fácil volver a escribir el código del bucle principal para que sea una función que llame una y otra vez y luego llamar a esa función desde runsimple ...

Se garantiza que no satisfaga plenamente sus requisitos, pero si tiene prisa, podría ser más fácil.

1

o simplemente utilizar Tornado, un servidor web sin bloqueo para Python que tiene una API similar a webpy - http://www.tornadoweb.org/

+0

Puede proporcionar un MWE, su sitio no es tan bueno – puk

0

También he utilizado recientemente Beanstalkd para poner en cola tareas que se ejecutarán en un hilo separado. Su controlador web.py simplemente inserta un trabajo en una tubería y se ejecuta una secuencia de comandos completamente separada. Puede tener cualquier cantidad de estos, y obtendrá los beneficios del control de cola avanzado, etc.