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

时间:2014-03-24 10:16:55

标签: python multithreading http python-3.x thread-safety

我正在编写这个小的演示代码来启动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服务器。

但我必须确保仅在成功调用urllib.request.urlopen且服务器正在为请求提供服务后才进行httpd.serve_forever调用。

http.server.HTTPServersocketserver.TCPServer中是否有任何标记或任何方法可以帮助我确保仅在准备好处理请求后才开始使用urllib.request.urlopen对其进行测试?

1 个答案:

答案 0 :(得分:3)

如果你的目标是在你的urlopen中没有得到一个空/无效答案,答案是你不会。 你实际用这一行打开一个套接字:

http.server.HTTPServer(...)

所以在它之后(仍然有一个线程在运行)你已经有一个打开的套接字监听传入的连接(尽管还没有调度请求)。在那之后我们可能会有两个线程的比赛。考虑两种可能性:

  1. 服务器线程首先运行serve_forever。嗯,就是你的目标。
  2. 主线程首先连接。您的连接将被接受,并将等待将其分发给处理程序。然后,服务器线程运行serve_forever,附加调度程序,您的请求仍然会被处理。