在Python中将简单的网络服务器集成到自定义主循环中?
我有一个用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()