这是我第一次在Python 3中使用Celery。为了弄湿我的脚,我从工人那里返回了一个字符串"这是一个你好任务",并将其存储为Postgres数据库。当我从我的数据库访问结果时,它以 Python 中的内存视图的形式出现,并且数据库本身有一个 celery_taskmeta 的结果列作为数据类型 bytea(这也是 Celery 发送到数据库的内容)。
这是我的芹菜配置:
import os
broker_url = os.environ.get('RABBITMQ_BIGWIG_TX_URL')
worker_concurrency = 3
result_backend = 'db+postgres://...'
task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
为什么我没有获得存储在数据库中的 json 结果?另外,我无法将bytea解码为json或utf-8文本,出现此错误:
以下是它以字节为单位的样子:b'x80x04x95x1bx00x00x00x00x00x00x00x8cx17"this was a hello task"x94.'
命令:json.loads(t.tobytes())
结果:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
您需要将字节数据转换为Unicode
t.decode("utf-8")
你需要用泡菜加载它。
import pickle
pickle.loads(t, encoding='utf-8')
我自己也在为此苦苦挣扎,试图让 Celery 将结果存储在 DB JSON 序列化而不是腌制中。