[英]Custom json serialization in celery
我正在嘗試將 celery 與已實現自定義序列化程序的自定義對象一起使用,但 celery 工作人員嘗試使用酸洗。
芹菜配置文件
broker_url = 'redis://localhost'
result_backend = 'redis://localhost'
imports = ('tasks',)
accept_content = ['application/x-json']
task_serializer = 'custom_json'
result_serializer = 'custom_json'
應用程序.py
from celery import Celery
from . import serializers
from . import celeryconfig
from kombu import serialization
serialization.register(
'custom_json',
serializers.dumps,
serializers.loads,
content_type='application/x-json',
content_encoding='utf-8',
)
app = Celery()
app.config_from_object(celeryconfig)
if __name__ == '__main__':
app.start()
主文件
from .tasks import my_task
my_obj = CustomClass()
my_task.delay(my_obj)
如果我的 class 在 python 中定義,則此代碼可以正常工作:
class CustomClass:
def __init__(self):
...
但我的CustomClass
實際上來自 Boost.Python 綁定,我從 an.so 文件導入,然后我從工作人員那里得到以下錯誤:
[2020-04-11 16:25:08,102: INFO/MainProcess] Received task: my_task[f73a3119-65d7-4a04-9e0d-2bc25ad19dde]
...
RuntimeError: Pickling of "CustomClass" instances is not enabled (http://www.boost.org/libs/python/doc/v2/pickle.html)
我知道錯誤消息建議深入研究他們的泡菜的具體情況。 但是使用自定義 json 序列化器的全部意義在於不要在這條路上使用 go。
所以我的問題是:為什么 celery 甚至嘗試使用酸洗?
編輯:作為一個虛擬示例,以下不可腌制的 class (無升壓)將產生以下錯誤:
Unrecoverable error: TypeError("can't pickle generator objects",)
class NonPicklableClass:
def __init__(self, arg):
self.gen = (i for i in arg)
class CustomEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, NonPicklableClass):
return {
'__type__': 'custom',
'raw': list(o.gen),
}
return o
def hook(o):
dtype = o.get('__type__')
if dtype == 'custom':
return NonPicklableClass(o['raw'])
def dumps(o):
return json.dumps(o, cls=CustomEncoder)
def loads(s):
return json.loads(s, object_hook=hook)
我顯然一定是誤會了什么
我想我明白了,作業是使用自定義序列化程序發送給工作人員的。
然而,在每個工作人員中,數據使用常規的 python 酸洗通過每個進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.