我正在写这个小小的演示代码来启动一个HTTP服务器,测试它正在成功运行,然后退出。如何测试Python http.server.HTTPServer是否永远在使用?
import http.server
import urllib.request
import threading
# Start HTTP server
httpd = http.server.HTTPServer(('', 8080), http.server.SimpleHTTPRequestHandler)
thread = threading.Thread(target=httpd.serve_forever)
thread.start()
# Test HTTP server and shutdown
print(urllib.request.urlopen('http://127.0.0.1:8080/').read())
httpd.shutdown()
这似乎工作正常,但它可能会运行良好,由于运气。你看,我在一个单独的线程中调用httpd.serve_forever
,这样我的脚本就不会在这个调用中阻塞,并且它可以继续调用urllib.request.urlopen
来测试HTTP服务器。
但是我必须确保我只在httpd.serve_forever
已成功调用并且服务器现在正在处理请求后才拨打urllib.request.urlopen
。
是否有任何标记或者http.server.HTTPServer
或socketserver.TCPServer
任何方法,这将有助于我确保我开始urllib.request.urlopen
测试它后,才准备好服务请求?
定期执行'urllib.request.urlopen('http://127.0.0.1:8080/').read()',或者简单地检查线程是否通过't.isAlive )'? – Torxed
@Torxed't.isAlive()'不能保证'http.server.HTTPServer'服务于请求。它只保证线程是活着的。我想避免定期调用urllib.request.urlopen('http://127.0.0.1:8080/').read()'。 –
然后使用'import select'和'.poll()'套接字对象来检查它是否存在(可以读/写数据)。因为不是,在某种方式或形状中,您需要手动检查以确定是否仍在运行。处理这种事件的线程通常应该足够了。通常你在Thread中有自己的'.recv()'函数,如果该线程关闭,这意味着服务器有效关闭,所以检查线程状态就足够了。 – Torxed