改进当前芹菜流程的实施

时间:2019-04-26 15:11:01

标签: python flask sqlalchemy celery flask-sqlalchemy

我最近一直在做芹菜。我以前没有使用过,但是我想使用它以异步方式处理对数据库的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”,因为它现在似乎还不干,我也不擅长在芹菜上知道怎么做。预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

选择何时将任务卸载给后台工作者是一个主观的问题,但是在类似您上面的示例的情况下,我希望查询在与Web请求相同的进程或线程中发生。

您上面显示的内容很可能需要几毫秒的时间。另一方面,如果您的查询需要10秒钟才能运行,则可以考虑是否应该将其作为后台任务,当然也要花费几分钟。

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

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