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

如何测试Python http.server.HTTPServer是否永远在服务?,python,multithreading,http,python-3.x,thread-safety,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

我正在编写这个小演示代码来启动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\u forever
,这样我的脚本就不会在这个调用中阻塞,它可以继续执行
urllib.request.urlopen
调用来测试HTTP服务器

但我必须确保只有在成功调用了
httpd.serve\u forever
并且服务器现在正在处理请求之后,我才进行
urllib.request.urlopen
调用


http.server.HTTPServer
socketserver.TCPServer
中是否有任何标志或方法可以帮助我确保只有在它准备好服务请求后才开始使用
urllib.request.urlopen
对其进行测试?

如果你的目标是在你的urlopen中不获得空/无效的答案,答案是你不会。 实际上,您可以使用以下行打开插座:

http.server.HTTPServer(...)
因此,在它之后(仍然有一个线程在运行),您已经有了一个打开的套接字来监听传入的连接(尽管还没有发送任何请求)。之后,我们可能会有两个线程的比赛。考虑两种可能性:

  • 服务器线程将永远首先运行serve_。好吧,这就是你的目标
  • 主线程首先连接。您的连接将被接受,并将等待有东西将其分派给处理程序。然后服务器线程永远运行serve_,附加一个调度程序,您的请求仍然得到处理

  • Do
    urllib.request.urlopen('http://127.0.0.1:8080/“)。定期读取()
    ,或者只需检查线程是否通过
    t.isAlive()
    运行?@Torxed
    t.isAlive()
    不保证
    http.server.HTTPServer
    正在为请求提供服务。它只保证线程是活动的。我想避免调用
    urllib.request.urlopen('http://127.0.0.1:8080/“)。定期读取()
    。然后使用
    import-select
    .poll()
    套接字对象检查它是否处于活动状态(可以读取/写入数据)。因为没有,以某种方式或形状,您需要手动检查是否仍在运行。处理此类事件的线程通常就足够了。通常,您在线程中有自己的
    .recv()
    函数,如果该线程停止运行,则意味着服务器实际上已停止运行,因此检查线程状态就足够了。您的意思是我不必担心客户端中出现空/无效响应吗?客户端将始终获得有效响应,因为服务器将等待dispatcher连接,然后发送有效响应?是的,这是正确的。客户端将始终得到有效的响应。你可以自己检查一下。只需在一个控制台中运行HTTPServer字符串并连接另一个控制台(即curl),然后使用第一个控制台永远运行service_。