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

5 投票
2 回答
1903 浏览
提问于 2025-04-15 16:03

我有一个用Python写的应用程序,里面有一个自定义的主循环(我觉得具体细节不重要)。我想在这个应用程序里集成一个简单的非阻塞式网页服务器,这样我就可以查看应用程序里的对象,甚至可能提供一个界面来操作这些对象。请问有什么好的方法吗?

我希望避免使用线程。理想的解决方案是一个有“逐步”功能的服务器,这个功能可以从我的主循环中调用,完成它的工作后再把控制权交回给主程序,等到下一次再继续。

解决方案越高层次越好(不过像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 个回答

-1

我建议你创建一个新的线程,然后运行一个网页服务器,比如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()
7

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()

撰写回答