在Django Python应用程序中,我使用Celery(任务管理器)启动作业。启动每个作业时,它们会返回一个对象(让我们称之为类X
的实例),该对象允许您检查作业并检索返回值或引发的错误。
有些人(有一天,我希望)能够同时使用这个网络界面;因此,类X
的几个实例可能同时存在,每个实例对应于排队或并行运行的作业。由于I cannot use a global variable (a dictionary that allows me to look up each X
objects from a key),很难想出一种方法来保留这些X
个对象;这是因为Celery使用不同的进程,而不仅仅是不同的线程,因此每个都会修改自己的全局表副本,造成混乱。
随后,我收到了使用memcached
分享任务内存的好建议。我得到了它的工作,并且能够在进程之间set
和get
整数和字符串值。
麻烦在于:经过今天的大量调试后,我了解到memcached
的{{1}}和set
似乎不适用于课程。这是我最好的猜测:也许在引擎盖内memcached序列化对象到共享内存; class get
(可理解)无法序列化,因为它指向实时数据(作业的状态),因此串行版本在加载时可能已过期(即可能指向错误的位置)再次。
尝试使用SQLite数据库同样毫无结果;我不仅无法弄清楚如何将对象序列化为数据库字段(使用我的Django models.py文件),我会遇到同样的问题:已启动作业的句柄需要以某种方式保留在RAM中(或使用一些幻想操作系统下面的操作系统),以便在作业完成或失败时更新。
我最好的猜测是(despite the advice that thankfully got me this far)我应该在一些外部队列中启动每个作业(例如Sun / Oracle Grid Engine)。但是,如果不使用系统调用,我无法想出一个很好的方法,我认为这可能是糟糕的风格(并且可能是不安全的)。
如何跟踪您在Django或Django Celery中发布的工作?您是通过简单地将作业参数放入数据库然后使用另一个轮询数据库并运行作业的作业来启动它们的吗?
非常感谢你的帮助,我很失落。
答案 0 :(得分:1)
我认为django-celery这对您有用。你看过django-celery制作的桌子了吗?即djcelery_taskstate
保存给定任务的所有数据,例如 state , worker_id 等。对于定期任务,有一个名为djcelery_periodictask
的表。
在Django视图中,您可以访问TaskMeta
对象:
from djcelery.models import TaskMeta
task = TaskMeta.objects.get(task_id=task_id)
print task.status