在Django web应用程序中,异步运行某些代码是否可行?如果可以,如何实现?
例如:
我有一个返回数百或数千个结果的搜索算法。我想要将这些项目输入到数据库中,以便查看用户搜索最多的内容。我不希望客户端需要等待额外的一百或一千个数据库插入操作。是否有一种方法可以异步执行此操作?这样做是否存在任何风险?还有更好的方法来实现吗?
在Django web应用程序中,异步运行某些代码是否可行?如果可以,如何实现?
例如:
我有一个返回数百或数千个结果的搜索算法。我想要将这些项目输入到数据库中,以便查看用户搜索最多的内容。我不希望客户端需要等待额外的一百或一千个数据库插入操作。是否有一种方法可以异步执行此操作?这样做是否存在任何风险?还有更好的方法来实现吗?
http://bugs.python.org/issue6721
话虽如此,我知道一些流行的性能分析工具使用线程来报告指标,因此这似乎是一种被接受的做法。
总之,最安全的方法似乎是使用标准库中的 threading.Thread 对象,只要你在其中执行的任何操作不会分叉(Python 的 multiprocessing 库)。
您将某些代码标记为“任务”。这通常是您想异步运行的函数。
Celery 管理工作进程 - 您可以将其视为线程 - 以运行这些任务。
要与工作进程通信,需要使用 消息队列。RabbitMQ 是经常推荐的消息队列。
在您的视图中,当您想要卸载一些工作时,您将使用 .delay()
选项调用执行该工作的函数。这将触发工作者在后台执行方法。
然后,您的视图立即返回响应。
然后,您可以检查任务的结果,并根据需要采取适当的行动。也有跟踪进度的方式。
还可以很好地使用缓存 - 这样就不会不必要地执行昂贵的任务。例如,您可能选择卸载请求以对搜索关键字进行分析,并将其放置在报告中。
生成报告后,如果适用,我会缓存结果,以便在以后请求时可以显示相同的报告 - 而不是再次生成。