有效的系列化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第三方库


热门话题
java什么数据库最类似于Map,每个用户/id存储无限多个“键”和“值”?   java仅使用super pom进行测试   内存不足如何解析java。OutOfMemoryError:Java堆空间在增加堆大小的情况下将意味着延迟OutOfMemoryError   来自另一个类的mysql和java jdbc调用[运行时应用程序]   java通过下拉菜单更改搜索框搜索的内容   JAVAlang.ClassNotFoundException:sun。jdbc。odbc。JdbcOdbcDriver   java Selenium点击链接   JavaSpringHibernate:从唯一值列表中获取对象列表   java Bing广告与桌面身份验证问题   java如何在没有任何外部SDK的情况下从安卓打印到收据打印机?   未调用java菜单片段类   java在IDEA和PyCharm中同时为同一个项目工作   java我们如何为同一个异常提供不同的海关信息   jakarta ee中是否预定义了“请求”和“响应”变量或值?   java更好地解决“之前和之后”难题?   尝试将数据从Excel添加到Java   发送电子邮件的Java代码只适用于一个电子邮件id?   java如何从资产解析XML?