首页 > 解决方案 > 如何从我的 Python 脚本中逆转接口上添加的延迟?

问题描述

在我的脚本中,我使用了另一个 Python 脚本中的 api。我可以添加延迟,但与 add_latency 类似,还有另一个功能可以消除延迟,即 remove_latency。我想要做的是在向接口添加延迟之后我想在执行 cntrl c 并调用 sigint 时将其删除。

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)

上面的代码是我用来添加和删除延迟的。下面是sighandler:

def gracefulExit(signal_number, frame):
        print('Signal received....Exiting gracefully')
        sys.exit(0)

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

elif args.addLatency:
        add_latency(args.mbxip, args.latency)
        if signal.signal(signal.SIGINT, gracefulExit):
                remove_latency(args.mbxip, args.latency)
elif args.removeLatency:
        remove_latency(args.mbxip, args.latency)

if __name__ == '__main__':
        try:
                main()
        except KeyboardInterrupt:
                pass

我无法调用 SIGINT 并消除延迟。正在发生的是立即添加和删除延迟,并退出脚本。我将脚本运行为./script.py --addLatency --latency 25 --mbxip

我想要的是,一旦我添加了延迟,脚本将在使用 control + c 调用 SIGINT 时退出,并在退出之前消除延迟。我怎样才能做到这一点?

标签: python

解决方案


你不需要使用信号。您必须消除按 ctrl-c 时执行的 except 块中的延迟。

但是在添加延迟后,程序将结束并退出。您应该以某种方式暂停 try 块中的执行,例如使用input()orsleep(99999999)


推荐阅读