Python Bottle API中的遥测

0 投票
1 回答
26 浏览
提问于 2025-04-12 20:21

我有一个简单的Python Bottle API,用来支持一个iOS应用。这个API托管在Heroku上。

我使用TelemetryDeck来进行数据分析,所以我想在每次API调用时发送一些信号。因为我不使用Node,所以不能用他们的JavaScript SDK,因此我必须通过HTTP发送信号。

这是我用来发送数据分析信号的函数。

def send_telemetry(type, success):
    url = TELEMETRY_DECK_URL
    headers = {
        "Content-Type": "application/json; charset=utf-8"
    }
    data = [
        {
            "isTestMode": "false",
            "appID": TELEMETRY_DECK_APP_ID,
            "clientUser": "apiProcess",
            "sessionID": "",
            "type": "API Called",
            "payload": {
                "api_type": type,
                "api_success": success
            }
        }
    ]
    response = requests.post(url, headers=headers, json=data)
    
    # Print to Heroku logs
    print(response.text)

这里是我从应用的路由中调用这个数据分析方法的一个例子。

@app.get('/')
def example():
    # Other code
    if result:
        send_telemetry("type", "true")
        response.status = 200
        return make_response(result)
    else:
        send_telemetry("type", "false")
        response.status = 404
        return make_error("Error (404)")

这一切都运行得很好,但我担心这个数据分析方法是在Bottle返回响应之前同步运行的,当然,由于WSGI的限制,它也不能在响应返回后运行。

有没有办法异步触发一个数据分析方法,而不在路由的调用点上拖慢执行速度,这样性能就不会受到影响。我希望能有一个“发出信号就忘记”的解决方案,不需要接收回调。

我看过使用multithreading的解决方案,但它们看起来比我需要的要复杂得多。

1 个回答

0

我其实是通过使用 threading 模块让这个功能正常工作的。

在我的路由处理程序里,我只需插入这段代码,它会生成一个线程来执行我的 send_telemetry 函数。这个函数会在一个单独的线程中运行,正如我所期望的那样,并不会阻碍 Bottle 返回响应的执行。

import threading

thread = threading.Thread(target=send_telemetry, args=["type", "true"])
thread.start()

撰写回答