改进当前芹菜工艺的实施

问题描述 投票:0回答:1

我最近一直在和芹菜一起工作。我之前没有使用它,但我想用异步方式处理sql查询到我的数据库,这样1个数据点不会阻止加载网页。 (这是一个很好的用例吗?)

我已经实现了类似下面的内容,但它似乎是多余的,可能有更好的方法来做到这一点。我真的很感激一些批评和建议。

示例代码:

@celery.task
def _get_player_name(player_tag):
    player = PlayerStatsCurrent.query.filter_by(player_tag=player_tag).first()
    return player.player_name

def get_player_name(player_tag):
    result = _get_player_name.delay(player_tag)
    while not result.ready():
        time.sleep(0.5)
    player_name = result.get()
    return player_name

在上面的例子中,我的网页调用get_player_name以及其他一些看似相似但计算成本更高的函数。

代码有效。我得到了预期的输出。我只是想让它变得更“pythonic”,因为它现在看起来并不干燥,而且我不太喜欢芹菜知道怎么做。预先感谢您的帮助。

python flask sqlalchemy celery flask-sqlalchemy
1个回答
1
投票

选择何时将任务卸载到后台工作者是一个有点主观的问题,但在上面的例子中,我会让查询发生在与Web请求相同的进程或线程中。

你上面展示的内容很可能需要几毫秒。另一方面,如果您的查询需要10秒才能运行,那么考虑它是否应该是后台任务是合理的,当然如果它需要几分钟。

我要说的另一点是,当你运行_get_player_name作为Celery任务时,get_player_name函数阻止等待它完成。如果您的Web处理程序正在调用后一个函数,则Web服务器进程/线程在任务期间仍然处于阻塞状态。

当我有一个启动后台任务的端点时,我让它创建一个作业记录并将该记录的ID返回给前端。然后,前端可以使用该作业ID定期轮询,以查看任务是否已完成。如果您的服务器支持,您也可以在这种情况下使用websockets。

© www.soinside.com 2019 - 2024. All rights reserved.