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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:36:04