Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用memcached设置/获取对象_Python_Django_Celery - Fatal编程技术网

Python 使用memcached设置/获取对象

Python 使用memcached设置/获取对象,python,django,celery,Python,Django,Celery,在Django Python应用程序中,我使用芹菜(任务管理器)启动作业。启动每个作业时,它们都会返回一个对象(让我们称之为类X)让您检查作业并检索返回值或抛出的错误 有几个人(我希望有一天)能够同时使用这个web界面;因此,类X的多个实例可能同时存在,每个实例对应于排队或并行运行的作业。很难想出一种方法来抓住这些X对象,因为;这是因为芹菜使用不同的进程,而不仅仅是不同的线程,因此每个进程都会修改自己的全局表副本,从而造成混乱 随后,我收到了使用memcached跨任务共享内存的建议。我让它工作

在Django Python应用程序中,我使用芹菜(任务管理器)启动作业。启动每个作业时,它们都会返回一个对象(让我们称之为类
X
)让您检查作业并检索返回值或抛出的错误

有几个人(我希望有一天)能够同时使用这个web界面;因此,类
X
的多个实例可能同时存在,每个实例对应于排队或并行运行的作业。很难想出一种方法来抓住这些
X
对象,因为;这是因为芹菜使用不同的进程,而不仅仅是不同的线程,因此每个进程都会修改自己的全局表副本,从而造成混乱

随后,我收到了使用
memcached
跨任务共享内存的建议。我让它工作,并且能够
设置进程之间的
获取
整数和字符串值

问题是:经过今天大量的调试,我发现
memcached
set
get
似乎对类不起作用。这是我最好的猜测:也许在幕后memcached将对象序列化到共享内存;类
X
(可以理解)无法序列化,因为它指向实时数据(作业的状态),因此再次加载时,串行版本可能已过期(即,它可能指向错误的位置)

使用SQLite数据库的尝试同样是徒劳的;我不仅不知道如何将对象序列化为数据库字段(使用我的Django models.py文件),而且还会遇到同样的问题:启动作业的句柄需要以某种方式留在RAM中(或者在下面使用一些奇特的操作系统技巧),以便在作业完成或失败时更新

我最好的猜测是()我应该在某个外部队列中启动每个作业(例如Sun/Oracle网格引擎)。然而,如果不使用系统调用,我无法想出一个好的方法来实现这一点,我认为这可能是一种糟糕的风格(并且可能是不安全的)

你如何跟踪你在Django或Django芹菜中启动的工作?您是否只需将作业参数放入数据库,然后让另一个作业轮询数据库并运行作业,就可以启动它们

非常感谢你的帮助,我很迷路。

我想这对你有用。你看过django芹菜做的桌子了吗?例如,
djcelery\u taskstate
保存给定任务的所有数据,如状态、工作者id等。对于定期任务,有一个名为
djcellery\u periodictask
的表

在Django视图中,您可以访问
TaskMeta
对象:

from djcelery.models import TaskMeta
task = TaskMeta.objects.get(task_id=task_id)
print task.status

我还是不完全明白。您的问题是类还是实例对象?您是否尝试使用Python的pickle模块来序列化和反序列化对象/类?是否有必要序列化整个对象,或者仅仅保存pk somehwere或将对象属性拆分为不同的部分就足够了?问题是引用的数据可能会更改,因此当序列化回时,它将不是最新的。基本上,它需要芹菜(或任务管理器使用的)在数据库或序列化对象集合发生变化时以原子方式更新数据库或对象集合。+1感觉就像我在重新发明以前做过的事情一样。你知道有没有办法用不同的后端做类似的事情?根据我的建议,我无法使用
amqp
后端执行您的建议。您必须使用数据库后端,但它解决了问题。谢谢@Reto。