首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >kombu.exceptions.EncodeError: set类型的对象在芹菜中不可序列化

kombu.exceptions.EncodeError: set类型的对象在芹菜中不可序列化
EN

Stack Overflow用户
提问于 2022-04-18 11:05:37
回答 1查看 1.7K关注 0票数 1

我有一个快速的API,在这里我使用芹菜来预测任务队列。每当我进行预测并试图返回一个响应时,我就会得到500 Undocumented Error: Internal Server Error,并从docker日志中收到一个错误。

代码语言:javascript
运行
复制
[2022-04-18 10:49:51,965: INFO/MainProcess] Connected to redis://redis:6379/0
[2022-04-18 10:49:51,969: INFO/MainProcess] mingle: searching for neighbors
[2022-04-18 10:49:52,980: INFO/MainProcess] mingle: all alone
[2022-04-18 10:49:53,044: INFO/MainProcess] celery@809b6efd8550 ready.
[2022-04-18 10:49:55,704: INFO/MainProcess] Task create_task[efcc7e7e-4fea-4c2d-b135-8aa546418327] received
[2022-04-18 10:50:05,748: ERROR/ForkPoolWorker-8] Task create_task[efcc7e7e-4fea-4c2d-b135-8aa546418327] raised unexpected: EncodeError(TypeError('Object of type set is not JSON serializable'))
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/kombu/serialization.py", line 39, in _reraise_errors
yield
File "/usr/local/lib/python3.8/site-packages/kombu/serialization.py", line 210, in dumps
payload = encoder(data)
File "/usr/local/lib/python3.8/site-packages/kombu/utils/json.py", line 68, in dumps
return _dumps(s, cls=cls or _default_encoder,
File "/usr/local/lib/python3.8/json/__init__.py", line 234, in dumps
return cls(
File "/usr/local/lib/python3.8/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/local/lib/python3.8/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/usr/local/lib/python3.8/site-packages/kombu/utils/json.py", line 58, in default
return super().default(o)
File "/usr/local/lib/python3.8/json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type set is not JSON serializable
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/celery/app/trace.py", line 517, in trace_task
mark_as_done(
File "/usr/local/lib/python3.8/site-packages/celery/backends/base.py", line 161, in mark_as_done
self.store_result(task_id, result, state, request=request)
File "/usr/local/lib/python3.8/site-packages/celery/backends/base.py", line 482, in store_result
self._store_result(task_id, result, state, traceback,
File "/usr/local/lib/python3.8/site-packages/celery/backends/base.py", line 909, in _store_result
self._set_with_state(self.get_key_for_task(task_id), self.encode(meta), state)
File "/usr/local/lib/python3.8/site-packages/celery/backends/base.py", line 372, in encode
_, _, payload = self._encode(data)
File "/usr/local/lib/python3.8/site-packages/celery/backends/base.py", line 376, in _encode
return dumps(data, serializer=self.serializer)
File "/usr/local/lib/python3.8/site-packages/kombu/serialization.py", line 210, in dumps
payload = encoder(data)
File "/usr/local/lib/python3.8/contextlib.py", line 131, in __exit__
self.gen.throw(type, value, traceback)
File "/usr/local/lib/python3.8/site-packages/kombu/serialization.py", line 43, in _reraise_errors
reraise(wrapper, wrapper(exc), sys.exc_info()[2])
File "/usr/local/lib/python3.8/site-packages/kombu/exceptions.py", line 21, in reraise
raise value.with_traceback(tb)
File "/usr/local/lib/python3.8/site-packages/kombu/serialization.py", line 39, in _reraise_errors
yield
File "/usr/local/lib/python3.8/site-packages/kombu/serialization.py", line 210, in dumps
payload = encoder(data)
File "/usr/local/lib/python3.8/site-packages/kombu/utils/json.py", line 68, in dumps
return _dumps(s, cls=cls or _default_encoder,
File "/usr/local/lib/python3.8/json/__init__.py", line 234, in dumps
return cls(
File "/usr/local/lib/python3.8/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/local/lib/python3.8/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/usr/local/lib/python3.8/site-packages/kombu/utils/json.py", line 58, in default
return super().default(o)
File "/usr/local/lib/python3.8/json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
kombu.exceptions.EncodeError: Object of type set is not JSON serializable

不知道为什么我会犯这个错误。

My worker.py

代码语言:javascript
运行
复制
@celery.task(name='create_task')
def create_task(solute, solvent):
    time.sleep(10)
    return {'Harsha'}

main.py

代码语言:javascript
运行
复制
@app.get(api_names[0])
async def predict(solute,solvent):
    task = create_task.delay(solute,solvent)
    return JSONResponse({'task_id': task.id})

@app.get('/predict_solubility/{task_id}')
async def post(task_id):
    task_result = AsyncResult(task_id)
    result = {
        'task_id': task_id,
        'task_status': task_result.status,
        'task_result' : task_result
    }
    return result

prediction

代码语言:javascript
运行
复制
response = {}
async def predictions(solute, solvent):
    response.clear()
    m = Chem.MolFromSmiles(solute,sanitize=False)
    n = Chem.MolFromSmiles(solvent,sanitize=False)
    if (m == None or n == None):
      response['predictions']= 'invalid SMILES'
      print('invalid SMILES')
    else:
      mol = Chem.MolFromSmiles(solute)
      mol = Chem.AddHs(mol)
      solute = Chem.MolToSmiles(mol)
      solute_graph = get_graph_from_smile(solute)
      mol = Chem.MolFromSmiles(solvent)
      mol = Chem.AddHs(mol)
      solvent = Chem.MolToSmiles(mol)
      solvent_graph = get_graph_from_smile(solvent)
      delta_g, interaction_map =  model([solute_graph.to(device), solvent_graph.to(device)])
      interaction_map_one = torch.trunc(interaction_map)
      response["interaction_map"] = (interaction_map_one.detach().numpy()).tolist()
      response["predictions"] = delta_g.item()

结果的屏幕快照

EN

回答 1

Stack Overflow用户

发布于 2022-04-18 21:22:23

为了解释错误消息的实际含义:在JSON中没有匹配集合的数据类型--也就是说,Python的Set()不能用JSON表示,所以当任务结果序列化为要返回的JSON时,将抛出一个错误。

如果在任务中看到代码,则返回一组:

代码语言:javascript
运行
复制
def create_task(solute, solvent):
    time.sleep(10)
    return {'Harsha'}

{value}语法在Python中创建了一个集合。您可能会认为您返回了一个字典,但这需要是空的,或者至少要创建一个key: value对作为一个dict (否则,会创建一个集合--如果只有一个值或多个值没有键)。

代码语言:javascript
运行
复制
return {'result': 'Harsha'}

。。会把字典还给我的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71910965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档