gpt4 book ai didi

Python Tornado - 使 POST 立即返回,同时异步函数继续工作

转载 作者:太空狗 更新时间:2023-10-29 21:41:08 27 4
gpt4 key购买 nike

所以我在下面有一个处理程序:

class PublishHandler(BaseHandler):

def post(self):
message = self.get_argument("message")
some_function(message)
self.write("success")

我面临的问题是 some_function() 需要一些时间来执行,我希望 post 请求在调用时立即返回,并且如果可能的话,some_function() 在另一个线程/进程中执行。

我使用 berkeley db 作为数据库,我想做的事情相对简单。

我有一个用户数据库,每个用户都有一个过滤器。如果过滤器匹配消息,服务器将消息发送给用户。目前,我正在对数千名用户进行测试,因此在每次通过发布请求发布消息时,它都会遍历数千名用户以找到匹配项。这是我做事的天真实现,因此是我的问题。我该如何做得更好?

最佳答案

您可以使用 IOLoopadd_callback 方法来完成此操作,如下所示:

loop.add_callback(lambda: some_function(message))

Tornado 将在下一个 IOLoop 传递中执行回调,这可能(我必须深入了解 Tornado 的胆量才能确定,或者测试它)允许请求在此之前完成代码被执行。

缺点是您编写的长时间运行的代码仍然需要时间来执行,这最终可能会阻塞另一个请求。如果您同时收到大量此类请求,那就不太理想了。

更安全的解决方案是在单独的线程或进程中运行它。由于 GIL,使用 Python 的最佳方法是使用进程(如果您不熟悉它,我强烈建议您阅读它)。然而,在单处理器机器上,线程实现同样可以正常工作,而且实现起来可能更简单。

如果您要走线程路线,您可以构建一个带有互斥体、线程和队列的漂亮的“异步执行器”模块。如果您想使用单独的进程,请查看 multiprocessing 模块。

关于Python Tornado - 使 POST 立即返回,同时异步函数继续工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3869421/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com