CherryPy本地服务器超时问题求助(含报错日志)
CherryPy本地服务器运行一段时间后出现写入超时问题
我在本地运行CherryPy服务器,运行一段时间后出现超时问题,作为CherryPy新手,我在error.log中发现如下报错,无法自行解决。
环境版本信息
CherryPy==18.8.0Cheroot==8.6.0Python==3.8.1
报错堆栈信息
Traceback (most recent call last): File "C:\Users\test\Envs\eps\lib\site-packages\cheroot\server.py", line 1300, in communicate req.respond() File "C:\Users\test\Envs\eps\lib\site-packages\cheroot\server.py", line 1090, in respond self.server.gateway(self).respond() File "C:\Users\test\Envs\eps\lib\site-packages\cheroot\wsgi.py", line 145, in respond self.write(chunk) File "C:\Users\test\Envs\eps\lib\site-packages\cheroot\wsgi.py", line 231, in write self.req.write(chunk) File "C:\Users\test\Envs\eps\lib\site-packages\cheroot\server.py", line 1146, in write self.conn.wfile.write(chunk) File "C:\Users\test\Envs\eps\lib\site-packages\cheroot\makefile.py", line 438, in write res = super().write(val, *args, **kwargs) File "C:\Users\test\Envs\eps\lib\site-packages\cheroot\makefile.py", line 36, in write self._flush_unlocked() File "C:\Users\test\Envs\eps\lib\site-packages\cheroot\makefile.py", line 45, in _flush_unlocked n = self.raw.write(bytes(self._write_buf)) File "c:\python381\lib\socket.py", line 687, in write return self._sock.send(b) File "c:\python381\lib\ssl.py", line 1173, in send return self._sslobj.write(data) socket.timeout: 写入操作超时
解决思路
1. 调整Cheroot服务器超时参数
CherryPy依赖Cheroot处理网络连接,可通过配置增大超时时间,避免因连接或写入等待过久触发超时:
import cherrypy class Root: @cherrypy.expose def index(self): return "Hello World" if __name__ == '__main__': cherrypy.config.update({ 'server.socket_timeout': 60, # 套接字读写超时(秒) 'server.connection_timeout': 300, # 连接建立超时(秒) 'server.thread_pool': 10 # 增加线程池,缓解连接积压 }) cherrypy.quickstart(Root())
2. 捕获写入超时异常
服务器向已断开的客户端写数据时会触发该错误,可在业务代码中捕获异常并处理:
import cherrypy import socket class Root: @cherrypy.expose def long_task(self): cherrypy.response.headers['Content-Type'] = 'text/plain' try: # 模拟长时间任务 for step in range(50): yield f"执行步骤 {step}\n" cherrypy.response.flush() # 实时刷新响应 except socket.timeout: cherrypy.log.error("客户端连接中断,写入超时") if __name__ == '__main__': cherrypy.quickstart(Root())
3. 升级Cheroot版本
当前使用的Cheroot 8.6.0版本较旧,可能存在超时处理的bug。建议升级到与CherryPy 18.8.0兼容的稳定版本:
pip install cheroot==10.0.0
4. 优化响应传输方式
若响应数据量大,使用分块传输(yield)替代一次性返回,减少缓冲区压力,降低超时概率。CherryPy在使用yield时会自动设置Transfer-Encoding: chunked头,无需手动配置。
内容的提问来源于stack exchange,提问作者OneTouchForHeight
相关产品推荐
相关产品推荐

