Интеграция простого веб-сервера в основной цикл в Python? - PullRequest
4 голосов
/ 16 ноября 2009

У меня есть приложение на python с пользовательским основным циклом (я не верю, что детали важны). Я хотел бы интегрировать простой неблокирующий веб-сервер в приложение, которое может анализировать объекты приложения и, возможно, предоставлять интерфейс для управления ими. Какой лучший способ сделать это?

Я бы хотел избежать всего, что использует потоки. Идеальным решением будет сервер с «степпинговой» функцией, которая может быть вызвана из моего основного цикла, выполнить свою задачу, а затем вернуть управление программой до следующего цикла.

Чем выше решение, тем лучше (хотя что-то такое монолитное, как Джанго, может быть излишним).

В идеале решение должно выглядеть так:

def main():
    """My main loop."""
    http_server = SomeCoolHttpServer(port=8888)

    while True:
        # Do my stuff here...
        # ...

        http_server.next() # Server gets it's turn.

        # Do more of my stuff here...
        # ...

Ответы [ 2 ]

7 голосов
/ 16 ноября 2009

Twisted разработан, чтобы сделать такие вещи довольно простыми

import time

from twisted.web import server, resource
from twisted.internet import reactor

class Simple(resource.Resource):
    isLeaf = True
    def render_GET(self, request):
        return "<html>%s Iterations!</html>"%n

def main():
    global n
    site = server.Site(Simple())
    reactor.listenTCP(8080, site)
    reactor.startRunning(False)
    n=0
    while True:
        n+=1
        if n%1000==0:
            print n
        time.sleep(0.001)
        reactor.iterate()

if __name__=="__main__":
    main()
0 голосов
/ 16 ноября 2009

Я бы предложил создать новый поток и запустить веб-сервер (например, встроенный в Python SimpleHTTPServer или BaseHTTPServer ). Потоки действительно не так страшны, когда дело доходит до этого.

from threading import Event, Thread
import BaseHTTPServer

shut_down = Event()

def http_server():
    server_address = ('', 8000)
    httpd = BaseHTTPServer.HTTPServer(server_address, BaseHTTPServer.BaseHTTPRequestHandler)

    while not shut_down.is_set():
        httpd.handle_request()

thread = Thread(target=http_server)
thread.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...