【问题标题】:How to launch mock HTTP server in separate thread Python?如何在单独的线程 Python 中启动模拟 HTTP 服务器?
【发布时间】:2017-12-11 15:38:29
【问题描述】:

我试图在我的 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 connection denied”。

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

【问题讨论】:

    标签: python mocking python-2.7 bottle


    【解决方案1】:

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

    当你这样做时:

    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 只会休眠当前正在运行的线程,因此您可以为服务器线程留出足够的时间来启动。

    现在,这一切都有些老套了,因此您可能需要查看您的服务器启动过程,看看是否有办法评估它是否已启动并运行,并在启动前等待这种情况。

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

    【讨论】:

    • 非常感谢!那个睡眠技巧帮助了我 :) 我想知道我之前是怎么没有想到的。
    猜你喜欢
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2014-08-26
    • 2014-04-26
    相关资源
    最近更新 更多