首页 > 解决方案 > 如何绕过 GIL 并处理 KeyboardInterrupt?

问题描述

我想在 KeyboardInterrupt 上退出一个 UDP 服务器,但这不能立即工作。在做一些研究时,我偶然发现了这个问题,有人认为这是 GIL 的问题。调用 C API 的 Python 进程可以阻止 Python 解释器处理中断。有什么办法可以在python中解除阻止吗?

我的代码如下:

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:      #works after new data is send to server
        print('Interrupted', file=sys.stderr)
        try:
            sys.exit(0)
        except SystemExit:
            os._exit(0)

主要的:

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server_address = ('localhost', 2000)
    s.bind(server_address)

    running = True
    print('Ready for connection')
    while running:
        try:
            msg = ""
            data, address = s.recvfrom(2000)    #look for timeout and interrupt
            msg = data.decode('utf-8')
            if not data:
                    break
            print(f'received {msg}')
            if msg[:5] == "PING-":
                print('sending PONG back to the client')
                message = 'PONG-' + msg[5:len(msg)]
                s.sendto(message.encode('utf-8'), address)
            else:
                print('bad format')
        except socket.error as socketerror:
            print(f'Error:  {socketerror}', file=sys.stderr)
    s.close()

当我没有运行客户端并按 ctrl-c 时,没有任何反应,程序什么也不做。当我启动客户端并发送一条 UDP 消息时,当服务器从客户端收到一条 UDP 消息时,中断就得到了完美的处理。然后丢弃 UDP 消息,客户端将其作为超时处理。超时后,客户端失去了连接。

目标是即使在客户端不运行且不使用 ctrl-break 的情况下也能退出服务器。

标签: pythonpython-3.xexceptiongilkeyboardinterrupt

解决方案


推荐阅读