如何测试Python http.server.HTTPServer是否永远服务?
作者:互联网
我正在编写此演示代码来启动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对其进行测试?
解决方法:
如果您的目标不是在urlopen中得到空的/无效的答案,答案是您不会.
您实际上使用以下行打开了一个套接字:
http.server.HTTPServer(...)
因此,在运行完一个线程之后,您已经有了一个开放的套接字来监听传入的连接(尽管还没有调度请求).之后,我们可能会遇到两个线程的竞争.考虑两种可能性:
>服务器线程首先运行serve_forever.好吧,这就是您要针对的情况.
>主线程首先连接.您的连接将被接受,并等待将其分派给处理程序.然后,服务器线程运行serve_forever,附加一个调度程序,您的请求仍然得到处理.
标签:multithreading,python-3-x,http,thread-safety,python 来源: https://codeday.me/bug/20191121/2055717.html