我最近一直在做芹菜。我以前没有使用过,但是我想使用它以异步方式处理对数据库的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”,因为它现在似乎还不干,我也不擅长在芹菜上知道怎么做。预先感谢您的帮助。
答案 0 :(得分:1)
选择何时将任务卸载给后台工作者是一个主观的问题,但是在类似您上面的示例的情况下,我希望查询在与Web请求相同的进程或线程中发生。
您上面显示的内容很可能需要几毫秒的时间。另一方面,如果您的查询需要10秒钟才能运行,则可以考虑是否应该将其作为后台任务,当然也要花费几分钟。
我要说的另一点是,当您将_get_player_name
作为Celery任务运行时,get_player_name
函数会阻止其等待完成。如果您的网络处理程序正在调用后一个函数,则在任务执行期间,网络服务器进程/线程仍然处于阻塞状态。
当我有一个启动后台任务的终结点时,我让它创建一个作业记录并将该记录的ID返回到前端。然后,前端可以使用该作业ID定期进行轮询,以查看任务是否已完成。如果服务器支持,在这种情况下,您也可以使用websockets。