Django带有守护进程

时间:2013-07-16 16:45:21

标签: django object daemon

这个问题涉及很多技术,但我会尽量保持简单。 如果,在某些时候,我做错了什么,请建议我。

我有一个 Django 项目,由 Nginx 提供,用于静态元素,代表 Apache 代表动态内容,在 Ubuntu Server OS

在某些时候,该应用正在创建一个包含 CDLL 实例的对象。 从那时起,我可以从 Python 访问 C 方法,一切运行良好。

碰巧我需要只创建一次CDLL实例。这意味着我应该能够为每个请求访问相同的实例,而不是为每个请求创建一个带有CDLL的对象。

为此尝试使用 Memcached ,缓存对象,如果它已经在缓存中使用它,否则创建它。 我无法直接缓存对象,因此我使用 Pickle 对对象进行编码和解码,即 jsonpickle lib。

Pickle适用于python对象,但它不能正确编码和解码CDLL。我的猜测是Python和C的编码器和解码器是不同的。

我试图为此找到一个解决方案并阅读有关类型转换对象方法的内容,这不是一个选项,因为这会混淆项目的整个架构和设计模式。

所以,我的下一步是使用Python在Ubuntu上创建守护程序进程,在那里我将使用CDLL创建对象的实例。 守护进程工作正常,我可以启动,停止并重新启动进程,创建实例并将该实例的引用保存到模块var(让我们称之为PYTHON_CDLL_OBJECT)。

启动守护程序进程的python模块与我的django项目位于同一路径上。

所以,回到项目,我正在导入PYTHON_CDLL_OBJECT。 我启动过程,我检查PYTHON_CDLL_OBJECT是否作为对CDLL对象的引用,它确实如此。 但是,在我的项目中,PYTHON_CDLL_OBJECT的值始终为None。

代码,简化版本:

我的守护进程看起来像这样:

BACKEND = None
class MyDaemon(Daemon):
    def run(self):
        global BACKEND
        try:
            while True:
                if not BACKEND:
                    from apps.backends import BackendsFactory
                    from apps.specs.models import Spec
                    from apps.core.models import Core
                    spec = Spec.objects.get(core=Core.objects.get(name="name"))
                    BACKEND = BackendsFactory.new(spec)

                time.sleep(1)
        except Exception, err:
            Daemon.run()

Daemon类是什么处理守护进程的启动,停止和重启,我只是重写run方法来满足我的需求。

在项目方面:

@classmethod
def new_backend(cls, backend):
    try:
        from dev.daemon import BACKEND
        if BACKEND:
            return BACKEND
        else:
            raise
    except Exception, err:
        logger.error("New backend error [%s]" % err)

所以...在项目方面,即使在我确定它已经有参考之后,BACKEND仍然是无。

很抱歉,如果我没有说清楚,感谢您就如何解决这个问题提出任何建议。

0 个答案:

没有答案