2014-03-24 19 views
3

我正在写这个小小的演示代码来启动一个HTTP服务器,测试它正在成功运行,然后退出。如何测试Python http.server.HTTPServer是否永远在使用?

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.HTTPServersocketserver.TCPServer任何方法,这将有助于我确保我开始urllib.request.urlopen测试它后,才准备好服务请求?

+0

定期执行'urllib.request.urlopen('http://127.0.0.1:8080/').read()',或者简单地检查线程是否通过't.isAlive )'? – Torxed

+0

@Torxed't.isAlive()'不能保证'http.server.HTTPServer'服务于请求。它只保证线程是活着的。我想避免定期调用urllib.request.urlopen('http://127.0.0.1:8080/').read()'。 –

+0

然后使用'import select'和'.poll()'套接字对象来检查它是否存在(可以读/写数据)。因为不是,在某种方式或形状中,您需要手动检查以确定是否仍在运行。处理这种事件的线程通常应该足够了。通常你在Thread中有自己的'.recv()'函数,如果该线程关闭,这意味着服务器有效关闭,所以检查线程状态就足够了。 – Torxed

回答

3

如果你的目标是在你的urlopen没有得到一个空的/无效的答案,答案是你不会。 实际上,你打开一个插座,这条线:

http.server.HTTPServer(...) 

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

  1. 服务器线程首先运行serve_forever。那么,你的目标就是这样。
  2. 主线程首先连接。您的连接将被接受,并将等待某些东西将其分发给处理程序。然后服务器线程运行serve_forever,附加一个调度程序,并且您的请求仍然得到处理。
+0

您的意思是我不需要担心客户端中的空/无效响应?客户端总是会得到一个有效的响应,因为服务器将等待分派器被连接,然后发送一个有效的响应? –

+1

是的,这是正确的。客户将始终得到有效的回复。你可以自己检查一下。只需在一个控制台中运行HTTPServer字符串并与另一个控制台连接(即curl http:// localhost:8080 /),然后在第一个控制台上运行service_forever。 – paulus

相关问题