【发布时间】:2012-08-14 22:26:29
【问题描述】:
我正在尝试对使用 tornado.httpserver 制作的简单 Tornado 服务器进行基准测试,但在 Solaris 机器上使用具有 1000 个或更多并发连接的 apache bench 时出现以下错误。
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/tornado-2.3-py2.7.egg/tornado/iostream.py", line 304, in wrapper
File "/usr/local/lib/python2.7/site-packages/tornado-2.3-py2.7.egg/tornado/httpserver.py", line 227, in _on_headers
LookupError: unknown encoding: latin1
我相信这是由于竞态条件导致 python 编解码器表处于无效状态。我的理解是 latin1 包含在 python 标准库中,所以只要没有修改 python 编解码器表,它就应该存在。
我查看了 tornado src,它似乎没有修改编解码器表,所以我想知道是否有人知道其他方法或问题可能会在多进程 python 应用程序中导致此问题或类似问题。
谢谢!!
服务器代码链接:https://www.dropbox.com/s/xrgj59sv0y5y31n/server_ioloop.py
【问题讨论】:
-
看起来是 Solaris 问题:groups.google.com/forum/#!msg/python-tornado/qmu8Yv6sW_I/…
-
感谢您的链接,但是,启动该线程的人在 OSX Lion 上看到了同样的问题。我还用使用事件端口和 devpoll 的实现替换了默认的 ioloop 实现,并且仍然看到了这个问题,所以我认为这可能与在 solaris 上选择用尽文件描述符无关。
-
我找到了解决此问题的以下解决方法。将 httpserver._on_headers 中的以下行从:
data = native_str(data.decode('latin1'))更改为data = native_str(codecs.latin_1_decode(data)[0])解决了我的问题,但很高兴知道根本原因。
标签: python-2.7 tornado latin1