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

Python脚本触发SIGINT信号时如何自动移除接口已添加的延迟

问题根因

你的代码存在3个核心错误导致预期逻辑不生效:

  • signal.signal()的返回值是该信号之前绑定的处理函数,默认返回值不为空,所以你写的if signal.signal(signal.SIGINT, gracefulExit):判断永远为真,添加延迟后会立刻执行移除逻辑
  • 添加延迟后没有做任何阻塞等待操作,脚本执行完添加逻辑就直接走完流程退出,等不到用户触发Ctrl+C
  • 你写的gracefulExit信号处理函数里没有调用remove_latency的逻辑,就算触发SIGINT也不会执行移除操作

修正后可运行代码

import sys
import signal
import time
import requests
import argparse as ap

def url(a, b, c):
    url = f"http://{a}:5000/{c}?ms={b}"
    return url

def main_func(url, endpoint_name):
    response = requests.get(url)
    if response.status_code // 100 == 2:
        print('OK')
        return True
    else:
        print(f"ERROR in {endpoint_name}. URL: {url}. Response code: {response.status_code}")
    return False

def add_latency(mbxIP, latency):
    return main_func(url(mbxIP, latency, 'add_latency'), "add_latency")

def remove_latency(mbxIP, latency):
    return main_func(url(mbxIP, latency, 'remove_latency'), "remove_latency")

def main():
    parser = ap.ArgumentParser()
    parser.add_argument('--latency', help='Latency in ms', required=True)
    parser.add_argument('--mbxip', help='MBX IP', required=True)
    parser.add_argument('--addLatency', help='Add latency on interface', action='store_true')
    parser.add_argument('--removeLatency', help='Remove latency from interface', action='store_true')
    args = parser.parse_args()

    # 定义信号处理函数,封装参数和移除逻辑
    def gracefulExit(signal_number, frame):
        print('\nSignal received....Exiting gracefully')
        if args.addLatency:
            # 触发信号时先执行移除延迟
            remove_latency(args.mbxip, args.latency)
        sys.exit(0)
    
    # 绑定信号处理
    signal.signal(signal.SIGINT, gracefulExit)

    if args.removeLatency:
        remove_latency(args.mbxip, args.latency)
    elif args.addLatency:
        add_latency(args.mbxip, args.latency)
        print(f"Latency {args.latency}ms added, press Ctrl+C to remove and exit")
        # 阻塞等待信号,避免脚本直接退出
        while True:
            time.sleep(3600)

if __name__ == '__main__':
    main()

核心修改点

  • 调整信号处理函数的定义位置,直接复用main函数内解析好的参数,确保触发SIGINT时可以执行移除延迟逻辑
  • 删除了原代码中错误的if signal.signal()判断分支,避免提前执行移除操作
  • 添加延迟后加入死循环阻塞逻辑,让脚本持续运行直到收到Ctrl+C信号
  • 修正了原代码缺失的包导入、参数必填校验、分支语法错误等问题
  • 把参数解析逻辑移到main函数内,避免全局变量污染

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:27:01