【问题标题】:Improving Implementation of current celery process改进当前芹菜工艺的实施
【发布时间】:2019-04-26 15:11:01
【问题描述】:

我最近一直在研究芹菜。我以前用的不多,但我想用异步方式处理对我的数据库的 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】:

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

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

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

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

    【讨论】:

    • 谢谢@zchtodd - 我会考虑我需要在哪里实现它以及何时需要使用 celery。我目前使用 Plotly Dash 来调用它,我相信它是建立在 React 之上的。但我确实需要继续学习芹菜和使用它的良好做法
    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 2020-08-13
    • 2022-10-25
    • 1970-01-01
    • 2021-07-12
    • 2011-06-05
    • 2021-10-24
    • 2014-08-17
    相关资源
    最近更新 更多