这个问题涉及很多技术,但我会尽量保持简单。 如果,在某些时候,我做错了什么,请建议我。
我有一个 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仍然是无。
很抱歉,如果我没有说清楚,感谢您就如何解决这个问题提出任何建议。