如何 "auto-schedule" 使用 celery 调用它的端点的执行?
How to "auto-schedule" the execution of a endpoint calling it using celery?
我有一个使用 Flask 和 Celery 的应用程序。现在我有一个名为“/get-products”的端点,但我希望在我调用它时安排它。
我想要的是调用那个端点,它自己安排,而不触发其他功能或任何东西
有办法吗?
这是总体思路:
创建一个函数,该函数将在名为 get_products_task
的函数中执行实际处理,并用 @celery_task
修饰它。然后 /get-products 的端点函数将确定它希望在未来多少秒 运行 芹菜任务并相应地安排它。例如:
@celery_task
get_products_task():
with app.app_context(): # if an application context is required
...
@app.route('/get-products')
def get_products():
task = get_products_task.apply_async(countdown=120)
return render_template('schedule_get_products_template.html'), 202
#return '/get-products has been scheduled!', 202
如果有时不延迟地调用 /get_products 端点,那么它的逻辑 确实应该分解成一个单独的函数,例如,get_products_logic
:
def get_products_logic():
"""
The actual logic for getting products.
The assumption is that an application context exists, if necessary.
"""
...
@celery_task
def get_products_task():
with app.app_context(): # if an application context is required
get_products_logic()
@app.route('/get-products')
def get_products():
get_products_logic()
return reneder_template('get_products_template.html'), 200
@app.route('/schedule-get-products')
def schedule_get_products():
task = get_products_task.apply_async(countdown=120)
return render_template('schedule_get_products_template.html'), 202
#return '/get-products has been scheduled!', 202
我有一个使用 Flask 和 Celery 的应用程序。现在我有一个名为“/get-products”的端点,但我希望在我调用它时安排它。
我想要的是调用那个端点,它自己安排,而不触发其他功能或任何东西
有办法吗?
这是总体思路:
创建一个函数,该函数将在名为 get_products_task
的函数中执行实际处理,并用 @celery_task
修饰它。然后 /get-products 的端点函数将确定它希望在未来多少秒 运行 芹菜任务并相应地安排它。例如:
@celery_task
get_products_task():
with app.app_context(): # if an application context is required
...
@app.route('/get-products')
def get_products():
task = get_products_task.apply_async(countdown=120)
return render_template('schedule_get_products_template.html'), 202
#return '/get-products has been scheduled!', 202
如果有时不延迟地调用 /get_products 端点,那么它的逻辑 确实应该分解成一个单独的函数,例如,get_products_logic
:
def get_products_logic():
"""
The actual logic for getting products.
The assumption is that an application context exists, if necessary.
"""
...
@celery_task
def get_products_task():
with app.app_context(): # if an application context is required
get_products_logic()
@app.route('/get-products')
def get_products():
get_products_logic()
return reneder_template('get_products_template.html'), 200
@app.route('/schedule-get-products')
def schedule_get_products():
task = get_products_task.apply_async(countdown=120)
return render_template('schedule_get_products_template.html'), 202
#return '/get-products has been scheduled!', 202