Python用schedule库每日下载加密货币交易所数据报错如何解决
报错修复方法
错误原因
schedule库的do()方法要求第一个入参是未执行的可调用对象(即函数本身)。你当前的写法直接执行了get_all_binance(xxx),把函数执行后的返回值传给了do(),返回值不满足可调用要求,因此触发TypeError。
修复代码
你只需要把函数参数放在do()方法的后续入参位置即可,不要直接在do()的第一个参数位置执行函数,修正后的代码如下:
import schedule import time # 这里保留你原本的get_all_binance函数定义 symbols = ['BTCUSDT', 'ETHUSDT', 'ADAUSDT', 'BNBUSDT', 'DOTUSDT', 'XRPUSDT', 'UNIUSDT', 'LTCUSDT', 'LINKUSDT', 'BCHUSDT', 'XLMUSDT', 'LUNAUSDT', 'DOGEUSDT', 'VETUSDT','ATOMUSDT', 'AAVEUSDT', 'FILUSDT', 'AVAXUSDT', 'TRXUSDT', 'EOSUSDT', 'SOLUSDT', 'IOTAUSDT', 'XTZUSDT', 'NEOUSDT', 'CHZUSDT', 'DAIUSDT', 'SNXUSDT', 'SUSHIUSDT', 'EGLDUSDT', 'ENJUSDT', 'ZILUSDT', 'MATICUSDT', 'MKRUSDT', 'COMPUSDT', 'BATUSDT', 'ZRXUSDT', 'RSRUSDT'] timeframes = [('1h','1h'), ('30m','30m'), ('4h','4h'), ('12h','12h'), ('1d','1d')] for symbol in symbols: for tf_folder, kline_size in timeframes: # 函数名作为第一个参数,后续跟所有入参 schedule.every().day.at("21:00").do(get_all_binance, timeframe_folder=tf_folder, symbol=symbol, kline_size=kline_size, save=True) while True: schedule.run_pending() time.sleep(5)
优化建议
当前配置会在每日21点同时触发185个下载任务,可能因请求频次过高触发交易所接口限流,你可以做如下优化:
- 把同一个币种的多时间粒度下载封装到一个函数中,每个币种仅添加1个定时任务
- 不同币种的任务设置不同的触发时间,间隔1-2秒错开请求
其他定时实现方案
- 系统原生定时任务:Linux/macOS可直接使用crontab,Windows使用任务计划程序,只需编写单次执行的下载脚本,配置定时触发规则即可,无需额外维护常驻进程,稳定性更高
- APScheduler:功能比schedule更完善,支持多线程执行、异步任务、cron规则触发器、任务持久化,适合复杂定时需求场景
- 云函数定时触发:各大云厂商的Serverless函数服务均支持定时触发器,无需自行维护服务器运行进程,按调用次数计费,适合轻量定时任务场景
- Celery Beat:如果你的项目已经使用Celery做任务队列,可搭配Celery Beat实现分布式定时任务,适合业务规模较大的场景
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

