python - 如何绕过 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 的情况下也能退出服务器。
解决方案
推荐阅读
- git - 我可以在几个已知的 git 命令之后从 git 中检索未提交的更改吗?
- python - Send_email 与 django 生成错误 _getfullpathname:
- java - Swagger OpenAPI 3.0:无法将 ApplicationPath / basePath 添加到我的 API 端点
- python - 识别熊猫系列中多个连续值为负数的时期
- google-contacts-api - 尝试使用 Google 登录时出现错误“应用程序被阻止”
- python - pyinstaller 运行完成后如何使 Windows 发出哔哔声?
- qt - QML for android 在 TextArea 方面存在很多问题......有什么想法可以解决这些问题吗?
- c++ - 可重用性:以向量为参数的函数
- java - 如何用名称显示所选动物的描述?
- sql - Teradata SQL:根据两列中的值选择行,其中姓名的顺序在 Teradata SQL 中并不重要?