我正在编写这个小的演示代码来启动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.HTTPServer
或socketserver.TCPServer
中是否有任何标记或任何方法可以帮助我确保仅在准备好处理请求后才开始使用urllib.request.urlopen
对其进行测试?
答案 0 :(得分:3)
如果你的目标是在你的urlopen中没有得到一个空/无效答案,答案是你不会。 你实际用这一行打开一个套接字:
http.server.HTTPServer(...)
所以在它之后(仍然有一个线程在运行)你已经有一个打开的套接字监听传入的连接(尽管还没有调度请求)。在那之后我们可能会有两个线程的比赛。考虑两种可能性: