Skip to main content
 首页 » 编程设计

python之如何在单独的线程 Python 中启动模拟 HTTP 服务器

2025年05月04日15zlslch

我试图在我的 python 脚本中模拟一个 HTTP 服务器,但它失败了。 这是我正在做的:

import bottle 
from restclient import GET 
from threading import Thread 
 
@bottle.route("/go") 
def index(): 
    return "ok" 
 
 
server = Thread(target = bottle.run) 
server.setDaemon(True) 
server.start() 
 
print "Server started..." 
 
response = GET("http://127.0.0.1:8080/go") 
 
assert response.body == "ok" 
 
print "Done..." 

基本上,我试图在单独的线程中启动带有 1 个测试路由的 bottle.py http 服务器,然后模拟来自它的响应。

但这行不通。服务器没有在单独的线程中启动,所以我在尝试请求它时总是收到“errno 111 连接被拒绝”。

那么问题是:如何解决?还有其他方法可以模拟 http 服务器吗?

请您参考如下方法:

您没有为网络服务器的启动留出足够的时间。

当你这样做时:

server.start() 
print "Server started..." 
response = GET("http://127.0.0.1:8080/go")    

刚启动就尝试访问服务器,

根据哪个线程(主线程或服务器线程)首先运行(以及运行多长时间),当您尝试访问它时,您可能会遇到服务器尚未启动的情况,因此 Connection Refused 错误。

您可以尝试执行以下操作:

server.start() 
import time 
time.sleep(...) # Something long enough 
# Continue your stuff. 

正如您在 time.sleep -- sleeps thread or process? 中看到的那样,执行 time.sleep 只会休眠当前正在运行的线程,因此您可以为服务器线程留出足够的时间来启动。

现在,所有这些都有些老套,所以您可能想查看您的服务器启动过程,看看是否有一种方法可以评估它是否已启动并正在运行,并在启动之前等待这种情况。

现在查看 bottle 源,我想不出一个解决方案来干净地做到这一点;您总是可以尝试反复访问服务器,直到它最终响应,从而表明服务器处于事件状态。