You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Celery中运行类任务?解决无法Pickle本地对象报错

问题修复方案

错误原因分析

  1. 静态方法参数错误:@staticmethod修饰的方法不需要self参数,你给get_balance添加了self,导致调用时把地址字符串传给了self,后续给self绑定的Web3连接对象无法被Celery的序列化机制(pickle)处理。
  2. 不可序列化对象:Web3的HTTPProvider及Web3实例属于无法被pickle序列化的本地对象,当Celery尝试序列化任务相关数据时就会触发报错。

修复代码

修正Eth类

移除静态方法的self参数,并且不在任何实例/类属性上绑定Web3连接,每次调用方法时创建连接:

from web3 import Web3, HTTPProvider

class Eth:
    @staticmethod
    def get_balance(address):
        conn = Web3(HTTPProvider("**************"))
        return conn.fromWei(conn.eth.getBalance(address, 'latest'), 'ether')

修正tasks.py调用

确保调用时只传地址参数:

from celery import shared_task
# 替换为Eth类所在的实际模块名
from your_eth_module import Eth

@shared_task
def eth_check():
    # ... 你的其他业务代码
    balance = Eth.get_balance("********")
    # ... 后续处理逻辑

额外优化建议

如果频繁调用该方法,每次创建HTTP连接会有性能损耗,可以考虑:

  • 用@classmethod维护一个类级别的Web3连接实例,但要注意Celery多进程环境下,每个worker进程会独立初始化连接,避免跨进程共享连接导致的问题。
  • 或者使用连接池来复用HTTP连接,减少重复创建的开销。

内容的提问来源于stack exchange,提问作者soroush safari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:45:41