簡體   English   中英

celery中的自定義json序列化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM