代码之家  ›  专栏  ›  技术社区  ›  David Eyk

在Python中将简单的Web服务器集成到自定义主循环中?

  •  4
  • David Eyk  · 技术社区  · 16 年前

    我在Python中有一个带有自定义主循环的应用程序(我认为细节并不重要)。我想将一个简单的非阻塞Web服务器集成到应用程序中,它可以内省应用程序对象,并可能提供一个操作它们的接口。最好的方法是什么?

    我想避免使用线程。理想的解决方案是一个带有“stepping”函数的服务器,可以从主循环调用它,执行它的操作,然后返回程序控制直到下一次执行。

    解决方案越高,效果越好(尽管像Django这样的整体式解决方案可能会被过度杀伤力)。

    理想情况下,解决方案如下:

    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 回复  |  直到 16 年前
        1
  •  7
  •   John La Rooy    16 年前

    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()
    
        2
  •  -1
  •   amcgregor    16 年前

    我建议创建一个新的线程并运行一个Web服务器(如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()