Как обойти GIL и обработать KeyboardInterrupt? - PullRequest
1 голос
/ 15 октября 2019

Я хочу выйти из UDP-сервера на KeyboardInterrupt, но это не работает сразу. проводя некоторые исследования, я наткнулся на этот вопрос , где кто-то предполагает, что это проблема с GIL. Процессы Python, вызывающие API C, могут блокировать интерпретатор 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)

main:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...