当我使用Python进行插座编程时,
我注意到某些操作并没有被中断。例如:accept()
或recv()
因此,我使用少量超时解决了这个问题,每1秒钟,程序就会停止操作并回想一下。例如,
socket.settimeout(1)
while True:
try:
socket.recv()
except timeout:
# back to socket.recv()
continue
except KeyboardInterrupt:
break
是否存在一些潜在的问题,例如在超时异常期间丢失一些消息,或者对操作系统进行重负载,等等?
?,您是否有更好的主意可以停止插座不使用超时?请告诉我,我感谢您的回答。
还有另外一件事需要考虑。我在Windows中测试了此程序,即使我按 ctrl ctrl c ,键盘间断也实际上升起。但是在MacOS或Linux中,按下 ctrl c 之后,键盘间断就会增加。Windows和Linux/Unix之间是否存在差异?
带有插座,丢失数据的风险取决于套接字类型。
使用SOCK_DGRAM
插座,没有保证该协议是可靠的。这意味着通常,无论您如何编程recv()
调用,您都应该期望某些消息会丢失。
使用SOCK_STREAM
,有一个保证传入的数据流将是可靠的,并且以相同的顺序发送。
如果您调用socket.settimeout(0)
或socket.setblocking(False)
,则recv()
将检查插座的接收缓冲区以输入数据,如果没有,则会失败,其错误取决于操作系统。这可以定期用于数据,同时还可以使用其他事情。但是,它还可以将特定于操作系统的行为引入您的程序。
另一种常见技术是创建一个线程,其唯一目的是发送和接收设置为阻止模式的套接字[socket.setblocking(True)
]。在这种情况下,线程可以调用recv()
并尽可能长时间等待直到数据真正进入。此设置使您可以将协议编程为send()
和recv()
调用之间的对话。
对于一次处理多个插座消息的应用程序,select()
可以用来找出集合中的哪些插座对recv()
的待处理数据。一个警告是,在需要高性能的情况下,select()
效率低下。