GitHub Actions工作流运行Python脚本后无法自动终止问题求助
问题原因分析
- 第一个死循环来自
read_email.py的read_email函数:当邮箱中没有任何邮件时,代码会进入else分支,休眠60秒后递归调用mail_connect()重新检查邮箱,只要一直没匹配到目标邮件,进程就永远不会退出。 - 第二个死循环来自
post_tweet.py的twitter_connect函数:你用了无差别裸except捕获所有异常,一旦Twitter凭证验证失败、接口调用出错,就会休眠120秒后递归调用自身重试,只要问题一直不解决,进程就会永远卡住。 - 本地运行正常是因为测试时刚好邮箱里有符合条件的邮件、且发推接口没有出现异常,刚好走通了全流程没有触发上述两个递归分支。
修复方案
- 修改
read_email.py的轮询逻辑:你的工作流已经配置了周内每天定时触发,不需要单次运行时持续轮询邮箱,没有找到邮件直接退出即可,等待下次定时任务自动执行。把read_email函数的else分支修改为:
else: print("未找到符合条件的邮件,本次任务退出") return
- 限制
twitter_connect的重试次数:不要用无限递归重试,改为最多重试2-3次就主动退出,避免无限卡死:
# 示例:最多重试3次 def twitter_connect(tweet_list, retry_count=0): load_dotenv() consumer_key = getenv('API_KEY') consumer_secret = getenv('API_KEY_SECRET') access_token = getenv('ACCESS_TOKEN') access_token_secret = getenv('ACCESS_TOKEN_SECRET') auth = OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = API(auth) try: api.verify_credentials() post_tweet(tweet_list, api) except Exception as e: if retry_count < 3: print(f"Twitter接口出错,120秒后重试,剩余重试次数:{2-retry_count}") sleep(120) twitter_connect(tweet_list, retry_count+1) else: print("重试次数已用完,任务退出") raise e
- 给GitHub Action增加超时防护:在
main.yml的buildjob下添加超时配置,避免意外情况导致任务无限运行:
jobs: build: runs-on: ubuntu-latest timeout-minutes: 20 # 最多运行20分钟自动终止 # 后面原有配置保持不变
内容的提问来源于stack exchange,提问作者ARNON
相关产品推荐
相关产品推荐

