javascript flask在节点await上立即响应

zi8p0yeb  于 2023-10-14  发布在  Java
关注(0)|答案(2)|浏览(99)

我有两个服务,服务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
vm0i2vca

vm0i2vca1#

当你分叉一个线程来运行函数时,它不能按时运行或在客户端发出请求后运行。如果你想在响应后运行这个函数,你可以使用decorate after_request。范例:

@bp_csv.after_request
def callback_library(response):
    if request.endpoint in ["bp_csv.get_library"]:
        library_id = request.args.get('library_id')
        LIB = Library(library_id)
        LIB.process()
    return response
k2arahey

k2arahey2#

有很多方法可以解决这个问题。但我认为最简单的方法是将该ID保存在类似缓存的系统中作为数组(例如Redis)并返回响应。在另一个函数中,你从数组中获取值(就像Redis中的FIFO)并处理它们。在这种情况下,你可以避免使用同一个函数来做多个工作,如果你认为合适的话,你也可以在以后缩放它。使用Redis也很简单,30分钟的速成班就可以让你上手。

相关问题