Python Bottle API中的遥测
我有一个简单的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()