Я хочу выйти из 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.