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

GitHub Actions工作流运行Python脚本后无法自动终止问题求助

问题原因分析
  • 第一个死循环来自read_email.py的read_email函数:当邮箱中没有任何邮件时,代码会进入else分支,休眠60秒后递归调用mail_connect()重新检查邮箱,只要一直没匹配到目标邮件,进程就永远不会退出。
  • 第二个死循环来自post_tweet.py的twitter_connect函数:你用了无差别裸except捕获所有异常,一旦Twitter凭证验证失败、接口调用出错,就会休眠120秒后递归调用自身重试,只要问题一直不解决,进程就会永远卡住。
  • 本地运行正常是因为测试时刚好邮箱里有符合条件的邮件、且发推接口没有出现异常,刚好走通了全流程没有触发上述两个递归分支。
修复方案
  1. 修改read_email.py的轮询逻辑:你的工作流已经配置了周内每天定时触发,不需要单次运行时持续轮询邮箱,没有找到邮件直接退出即可,等待下次定时任务自动执行。把read_email函数的else分支修改为:
else:
    print("未找到符合条件的邮件,本次任务退出")
    return
  1. 限制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
  1. 给GitHub Action增加超时防护:在main.yml的build job下添加超时配置,避免意外情况导致任务无限运行:
jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 20 # 最多运行20分钟自动终止
    # 后面原有配置保持不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:15:02