model_unpickle() 正好需要 3 个参数(给定 1 个)

Posted

技术标签:

【中文标题】model_unpickle() 正好需要 3 个参数(给定 1 个)【英文标题】:model_unpickle() takes exactly 3 arguments (1 given) 【发布时间】:2018-02-02 22:39:09 【问题描述】:

我在使用 celery 3.1.25 和 4.1.0 时遇到了这个错误,如果我使用 pickle 设置序列化会发生这种情况(我知道这是安全问题)但我使用的库需要这种序列化才能工作有文件,有人解决过这个问题吗?

将在问题底部添加我的冻结。

谢谢

无法解码消息正文:DecodeError(TypeError('model_unpickle() 恰好需要 3 个参数(1 个给定)', , (('data_importer', 'FileHistory'),)),) [type:u'application/x- python-serialize' encoding:u'binary' headers:u'origin': u'gen29@f6876eb537fc', u'lang': u'py', u'task': u'data_importer_task', u'group':无,u'root_id':u'655b3b91-b48e-41c3-a893-ab7b5bdfdf79',u'expires':无,u'retries':0,u'timelimit':[3600,无],u'argsrepr': u'()', u'eta': 无, u'parent_id': 无, u'id': u'655b3b91-b48e-41c3-a893-ab7b5bdfdf79', u'kwargsrepr': u"'source': , 'importer': , 'file': , 'owner': >, 'subproject': , 'action': 'u'"] 正文:'\x80\x02)q\x01(U\x06sourceq\x02cdjango.db.models.base\nmodel_unpickle\nq\x03U\rdata_importerq\x04U\x0bFileHistoryq\x05\x86\x85Rq\x06q\x07(U \x06statusq\x08K\x01U\x0bfile_uploadq\tXI\x00\x00\x00upload_history/map_su/2018/02/02/7bee4c1c-751c-44df-a318-d527916148f5.xlsU\x0fcontent_type_idq\nK\x17U\x17U\x0f_django_version U\ncreated_atq\x0ccdatetime\ndatetime\nq\rU\n\x07\xe2\x02\x02\x16\x188\x00\r\xd7cpytz\n_UTC\nq\x0e)Rq\x0f\x86Rq\x10U\x06_stateq\x11cdjango。 db.models.base\nModelState\nq\x12)\x81q\x13q\x14(U\x06addingq\x15\x89U\x02dbq\x16U\x07defaultq\x17ubU\nupdated_atq\x18h\rU\n\x07\xe2\x02 \x02\x16\x188\x00\r\xf4h\x0f\x86Rq\x19U\tobject_idq\x1aNU\x07is_taskq\x1bK\x00U\x13_content_type_cacheh\x03U\x0ccontenttypesq\x1cU\x0bContentTypeq\x1d\x86\x85Rq\x1eq\x (h\x0bU\x061.11.9U\x05modelq X... (220389b) 回溯(最近一次通话最后): _receive_callback 中的文件“/usr/local/lib/python2.7/dist-packages/kombu/messaging.py”,第 592 行 解码 = 无 if on_m else message.decode() 解码中的文件“/usr/local/lib/python2.7/dist-packages/kombu/message.py”,第 142 行 self.content_encoding, 接受=self.accept) 加载中的文件“/usr/local/lib/python2.7/dist-packages/kombu/serialization.py”,第 184 行 返回解码(数据) 文件“/usr/lib/python2.7/contextlib.py”,第 35 行,在 __exit__ self.gen.throw(类型,值,回溯) _reraise_errors 中的文件“/usr/local/lib/python2.7/dist-packages/kombu/serialization.py”,第 59 行 reraise(包装器,包装器(exc),sys.exc_info()[2]) _reraise_errors 中的文件“/usr/local/lib/python2.7/dist-packages/kombu/serialization.py”,第 55 行 屈服 加载中的文件“/usr/local/lib/python2.7/dist-packages/kombu/serialization.py”,第 184 行 返回解码(数据) 文件“/usr/local/lib/python2.7/dist-packages/kombu/serialization.py”,第 64 行,在 pickle_loads 返回负载(BytesIO(s)) DecodeError: ('', , (('data_importer', 'FileHistory'),)) Django==1.11.9 芹菜==4.1.0 台球==3.5.0.3 amqp==2.2.2 数据导入器==3.0.2 海带==4.1.0

【问题讨论】:

pickle 不能很好地处理函数 您能否也为您的任务添加代码,如果在 Django 中发生这种情况,可能会添加更多细节,例如调用任务的 views.py 或 models.py 【参考方案1】:

不确定你是否能够解决这个问题,但我今天早上遇到了完全相同的问题,并将其追溯到 pickle 被发送了一个复杂的对象,生产者可以序列化但消费者不能序列化,导致像描述的那样崩溃在你的票。

生产者运行 Celery 4.4,消费者运行 3.1.25。 99.5% 的消息都顺利通过。我查看了两个 Celery 版本所需的 kombu 版本。

完整列表 4.4

pytz>dev
billiard>=3.6.1,<4.0
kombu>=4.6.7,<4.7
vine==1.3.0

完整列表 3.1.25

pytz>dev 
billiard>=3.3.0.23,<3.4
kombu>=3.0.37,<3.1

所以 Kombu 包是不同的,您将无法运行相同版本的同时在生产者和消费者方面也有不同的 Celery 版本。这对我们来说不是一个大问题,我们最终运行了在 sentry.io 中弹出错误时同步崩溃的作业。我们明天将更新消费者,以便他们再次运行相同的版本,这应该可以解决。

【讨论】:

以上是关于model_unpickle() 正好需要 3 个参数(给定 1 个)的主要内容,如果未能解决你的问题,请参考以下文章

Django loaddata 错误 __init__() 正好需要 3 个参数(给定 1 个)

每周一练:冒泡排序

shell for 与if多条件实例

2022-06-12:在N*N的正方形棋盘中,有N*N个棋子,那么每个格子正好可以拥有一个棋子。 但是现在有些棋子聚集到一个格子上了,比如: 2 0 3 0 1 0 3 0 0 如上的二维数组代表,一

解决拿蛋问题的时候,通过几个shell脚本运算速度对比,体会了算法和编程优化的重要性

如何使用输入将正好5个字符放在一个字符串中并将它们分开