部署复刻自Github的Telegram Bot到Heroku遇RuntimeError求助
解决Heroku部署Telegram Bot时的RuntimeError问题
错误原因
该错误是由于Python解释器即将关闭时,pymongo的周期性执行器仍尝试创建新线程,导致线程创建与解释器退出的冲突。通常是因为程序未正确处理MongoDB连接的关闭,或未响应Heroku的进程退出信号。
解决方法
- 显式关闭MongoDB连接:在程序退出逻辑中主动关闭MongoDB客户端实例,避免后台线程继续运行:
# 假设client是你的pymongo.MongoClient对象 client.close() - 捕获退出信号并清理资源:监听Heroku发送的
SIGTERM和SIGINT信号,在收到信号时先关闭连接、停止Bot运行再退出:import signal import sys from telegram.ext import Updater # 根据你使用的Bot库调整 def cleanup_and_exit(signal_num, frame): # 关闭MongoDB连接 client.close() # 停止Telegram Bot的运行(以python-telegram-bot为例) updater.stop() sys.exit(0) # 注册信号处理函数 signal.signal(signal.SIGTERM, cleanup_and_exit) signal.signal(signal.SIGINT, cleanup_and_exit) - 降级pymongo版本:Python 3.12对线程创建时机的限制更严格,尝试指定兼容的pymongo版本到
requirements.txt:pymongo<4.6 - 确认Heroku启动命令:确保Procfile中的启动命令能让Bot持续运行,而非执行后立即退出。例如:
web: python bot.py
内容的提问来源于stack exchange,提问作者Vivek Tp
相关产品推荐
相关产品推荐

