You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CherryPy本地服务器超时问题求助(含报错日志)

CherryPy本地服务器运行一段时间后出现写入超时问题

我在本地运行CherryPy服务器,运行一段时间后出现超时问题,作为CherryPy新手,我在error.log中发现如下报错,无法自行解决。

环境版本信息

  • CherryPy==18.8.0
  • Cheroot==8.6.0
  • Python==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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:55:30