如何测试Python http.server.HTTPServer是否永远服务?

4 投票
1 回答
4231 浏览
提问于 2025-04-17 23:38

我正在写一段小代码,用来启动一个HTTP服务器,测试它是否正常运行,然后再退出。

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 进行测试呢?

1 个回答

5

如果你的目标是确保在使用urlopen时不会得到空的或无效的答案,那你就不会得到这样的结果。

实际上,你在这一行代码中打开了一个“插座”(socket):

http.server.HTTPServer(...)

所以在这之后(仍然有一个线程在运行),你已经有了一个打开的插座在等待连接(虽然还没有处理请求)。接下来,我们可能会遇到两个线程之间的竞争。考虑这两种情况:

  1. 服务器线程先运行serve_forever。这是你想要的情况。
  2. 主线程先连接。你的连接会被接受,并且会等待某个东西来处理它。然后服务器线程运行serve_forever,连接上一个处理器,你的请求仍然会被处理。

撰写回答