在Django Web应用中处理计算密集型任务
我有一个桌面应用程序,现在正在把它转移到Django的网页应用上。这个应用里有一些计算量很大的部分(使用了numpy、scipy和pandas等库)。显然,把这些计算密集的代码直接放到网页应用里运行并不是个好主意,因为这样会让用户等很久才能得到回应。
所以,你需要把这些任务交给后台进程去处理,等处理完成后再通过AJAX通知用户,或者把结果存到数据库里。
另外,如果有多个用户同时使用,你也不想让所有的任务都同时运行,因为这样会让服务器负担很重,即使请求数量不多也会让服务器崩溃。理想情况下,你希望每个网页应用的实例把它的任务放到一个任务队列里,然后这个队列会自动以最佳方式运行这些任务(根据可用的核心数、内存等情况)。
有没有什么好的Python库可以帮助解决这个问题?在这种情况下,人们通常会使用什么策略?还是说这只是选择一个好的批处理调度器,然后为每个进程启动一个新的Python解释器的问题?
1 个回答
10
我们开发了一个Django网页应用,这个应用需要进行大量计算(每个过程在高性能服务器上完成需要11到88个小时)。
Celery: Celery是一个基于分布式消息传递的异步任务队列/作业队列。它主要用于实时操作,但也支持定时任务。
Celery提供了:
- 异步运行任务。
- 分布式执行耗时的过程。
- 定期和/或定时的任务。
- 如果出现问题,可以重试任务。
这只是Celery功能的冰山一角。它还有很多其他功能,建议你查看一下文档和常见问题。
你还需要设计一个很好的工作流画布。比如说,当有多个用户同时使用时,你不希望所有任务都同时运行,因为这会消耗很多资源。此外,你可能还想根据当前在线的用户来安排任务。
另外,你还需要一个很好的数据库设计、高效的算法等等。