我有两个服务,服务A(节点)和服务B( flask ),服务A上有一个端点,它调用服务B的端点,如下所示:
const response = await axios.get(
endpoint_url,
{
params: {
library_id: req.query.library_id,
},
}
);
在服务B上,这将转到一个库更新路由,该路由在一个for
循环中更新该库的所有书籍,这需要一些时间。我希望服务B立即响应并在后台进行计算。有一些建议的库,比如Threading,Celery,但我不知道哪一个最适合我,我选择了Threading,因为它看起来最简单。我实现了下面的代码,但是“测试”并没有在线程启动后立即打印出来,整个process
函数在响应被发送回node app之前被执行。我做错了什么?
服务B端点:
import threading
from src.Library import Library
@bp_csv.route('update-library', methods=['GET'])
def get_library():
library_id = request.args.get('library_id')
if not library_id:
raise ValueError("Missing query parameter 'library_id' ")
LIB = Library(library_id)
thread = threading.Thread(target=LIB.process()).start()
print("testing")
status_code = 202
return_message = "Updating library"
response = make_response(
jsonify({"message": str(return_message)}), status_code)
response.headers["Content-Type"] = "application/json"
return response
2条答案
按热度按时间vm0i2vca1#
当你分叉一个线程来运行函数时,它不能按时运行或在客户端发出请求后运行。如果你想在响应后运行这个函数,你可以使用decorate
after_request
。范例:k2arahey2#
有很多方法可以解决这个问题。但我认为最简单的方法是将该ID保存在类似缓存的系统中作为数组(例如Redis)并返回响应。在另一个函数中,你从数组中获取值(就像Redis中的FIFO)并处理它们。在这种情况下,你可以避免使用同一个函数来做多个工作,如果你认为合适的话,你也可以在以后缩放它。使用Redis也很简单,30分钟的速成班就可以让你上手。