urllib中URLError与TimeoutError超时差异及触发原因问询
两种超时异常的触发原因及超时时间差异解析
URLError(带'timed out'原因)的触发逻辑
这种异常发生在TCP连接建立阶段:
- 调用
urllib.request.urlopen()时,首先要和目标服务器完成TCP三次握手建立连接,这个阶段的超时严格遵循你设置的timeout=1.0参数。 - 由于是系统socket层直接触发的超时信号,实际触发时间和1.0秒的误差仅几毫秒,属于系统调度、网络栈处理的正常延迟。此时urllib会将socket的超时异常包装为
URLError,并将原因标记为'timed out'。
TimeoutError的触发逻辑
这种异常发生在TCP连接建立成功后,读取响应数据阶段:
- 当TCP连接已建立,但服务器迟迟不返回响应数据,或数据传输过程中出现长时间停顿,就会触发该异常。
- 超时时间高于设定值的核心原因:
- socket的超时设置是单次IO操作的超时,而非整个读取流程的总超时。比如
page.read()可能拆分为多次底层IO调用,每次调用都使用1秒超时,总耗时就可能超过1秒。 - 系统调度与异常捕获的开销:IO超时触发后,Python解释器捕获异常、处理栈帧需要一定时间,加上系统线程调度的延迟,会让实际记录的超时时间比设定值多出20-100毫秒。
- socket的超时设置是单次IO操作的超时,而非整个读取流程的总超时。比如
内容的提问来源于stack exchange,提问作者ullix
相关产品推荐
相关产品推荐

