有效的系列化django模型,用于芹菜,以确保世界的状态。

django-cereal的Python项目详细描述


Celery中使用的DjangoModels的高效序列化,确保 世界的状况。

对于python版本2.7、3.3、3.4、3.5和 pypy(django支持python版本)。

情景

如果您使用的是DjangoCelery,则最有可能传递实例 在任务之间来回移动,或者像芹菜一样, 只将主键传递给任务,然后检索模型 具有主键的实例。

如果你在做前者,它可能效率低下,而且肯定是危险的 当任务执行时,模型数据可能会改变!

如果你用的是后者,你可能会想,当然有 是更好的方法吗?!虽然它很有效率,而且确实可读性很差 在每项任务开始时不断获取模型会非常有趣…

您也可以使用模型方法作为任务,但是除非您使用 与this refresh decorator类似,可能会有过时的模型数据。

Django麦片救援…

工作原理

django谷类食品的工作原理是在发送任务之前使用另一个序列化程序 到消息总线,然后在 反序列化。目前只支持pickle(请随意使用fork和 实现json或yaml)。

本质上,当模型被序列化时,只有主键和模型的 全班都泡菜了。这显然不如腌制 模型主键,但它肯定比序列化整个模型要好!

当芹菜工人拾取任务并反序列化 使用YourModel.objects.get(pk=xxx)检索模型,因此 这种方法也很安全,因为您在任务中没有使用过时的模型数据。

序列化程序是registered with kombu并且是安全的修补程序 django.db.Model.__reduce__-它只在kombu的范围内运行 这样就不会影响模特在康布外面的腌制了。

安装

您可以通过python包索引(pypi)安装django-graines。 或者来自Github。

使用pip;安装

$ pip install django-cereal

来自Github;

$ pip install git+https://github.com/alexhayes/django-cereal.git

用法

所需的是指定Kwargserializer时 定义任务。

fromdjango_cereal.pickleimportDJANGO_CEREAL_PICKLE@app.task(serializer=DJANGO_CEREAL_PICKLE)defmy_task(my_model):...

还有一个helper任务可用于定义序列化程序,如果 还没准备好。

fromdjango_cereal.pickleimporttask@taskdefmy_task(my_model):...

另一种方法是将CELERY_TASK_SERIALIZER设置为 django-cereal-pickle

模型任务方法

您还可以在django模型上使用task方法,因此不必定义 它们在tasks.py中。例如;

fromcelery.contrib.methodsimporttask_methodfromdjango_cereal.pickleimportDJANGO_CEREAL_PICKLEfromyourproject.celeryimportapptask_method_kwargs=dict(filter=task_method,serializer=DJANGO_CEREAL_PICKLE)classMyModel(models.Model):@app.task(name='MyModel.foo',**task_method_kwargs)deffoo(self):# self is an instance of MyModel

然后,您可以按如下方式调用任务;

bar=MyModel.objects.get(...)bar.foo.delay()

就像你的普通任务一样,但是你可以停止定义那些简单的 在模型上编排调用并直接调用模型。

链接任务方法

如果您使用的是 django将方法建模为任务,或者将任何类方法建模为任务, 你在链接这些任务,你可能对 @ensure_self decorator(有关详细信息,请参见Celery issue #2137)。

数据库连接

请注意,如果在芹菜中使用--maxtasksperworker标志,或在 其他类似的情况下,与django中的数据库的连接可能变成 不可用,并引发以下错误;

OperationalError(2006,'MySQL server has gone away')

这现在由unpickling通过关闭数据库连接来处理 这将强制创建一个新连接。

也许将来会有更好的方法来处理这个问题,例如, 每次创建工作进程时都会创建一个新连接,但目前为止 即使不太理想,原地踏步也行。

许可证

此软件是根据麻省理工学院的许可证授权的。请参阅LICENSE 顶级发行版中的文件i完整许可证文本的位置目录。

作者

亚历克斯·海斯,alex@alution.com>;

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Java7和Java8中从现有列表创建不同的列表?   java如何在HP ALM中上载测试结果   java请检查我想使用的代码,当用户在第一次输入中输入0时,条件必须停止   带显示列表的java OpenGL照明   尝试获取活动的DefaultSharedReferences时发生java NullPointerException   java如何区分日期时间类型应为yyyymmdd hh:mm:ss的两个日期   Java中对象上的循环   java jvm挂起并杀死3&jmap失败   Tomcat下的java URLClassLoader   java如何对基于KinesRecord的DoFn进行单元测试?   java Estado HTTP 404–找不到Eclipse/Tomcat   java Spring:缺少必需的请求正文。无法将JSON传递给RestController   java Drools工作台目标   java@Async在REST类中不起作用   rest如何在用户使用java输入时更有效地从Yammer获取消息?   java监视递归过程中创建的内部堆栈上的值   java如何集群和负载平衡Spring+OSGi应用程序   java NotSerializableException对象