2012-02-03 74 views
1

我有一个django项目与各种应用程序,这是完全独立的。我想让他们在自己的进程中运行每一个进程,因为他们中的一些产生后台线程来周期性地预先计算一些数据,现在他们正在争夺CPU(该机器有很多内核,但是你知道,GIL和这样的...)拆分Django项目

那么,有没有一种简单的方法,以项目自动分割成不同的人,或者至少使每个应用程序住在自己的进程?

回答

4

你总是可以有不同的设置文件,但会像有多个项目,甚至多个端点。通过一些努力,您可以根据请求的路径等配置反向代理以转发到正确的Django服务器,但我不认为这就是您想要的,这对您的问题会是一个丑陋的解决方案。

解决方法是将繁重的处理移动到作业队列。很多人和项目都喜欢Celery

如果这似乎有点小题大做出于某种原因,你总是可以实现自己的基于简单的cron作业。你可以看看my small project这样做。

+0

芹菜是一个选项,当谷歌搜索我的问题的解决方案,我认为它可能是值得研究它:-) – fortran 2012-02-03 12:41:01

1

最简单的简单的可能是写一个custom management command是观察新的条目给定的模型(数据库表),并对其进行处理。该模型由例如Django视图和管理命令从cron定期启动(例如每5分钟)。

实施例:在网站上的用户寄存器,但帐户创建是昂贵的操作(分配一些空间,操作远程服务等)。因此,您只需向AccountRequest表(AccountRequest.objects.create(...))写入新记录。然后,cron定期启动管理脚本(./manage.py account_creator),该脚本检查新的AccountRequest-s(AccountRequest.objects.filter(unprocessed=True)),完成其工作并将这些请求标记为已处理。

+0

这工作,我也这样做,但你可能会遇到问题,因为竞争条件可能会发生,这就是为什么我更喜欢一个更通用的解决方案,有这个小小的壮举。 – 2012-02-03 13:03:20

+0

@亚历山大:你的意思是什么样的竞争条件? – 2012-02-03 13:13:02

+1

Tomasz,根据定义,后台作业缓慢且不可预测,cron.d不关心这个问题。有一次,我最终处于一个原始进程开始的速度太慢而无法在分配的X分钟内完成的情况,所以cron一直在启动进程,这最终导致我的服务器完全停止:-) ...并且还有2个进程正在处理相同的数据,然后打开另一个蠕虫的可能性。所以必须注意确保这两件事情不会发生。 – 2012-02-03 13:36:54