tornado.websocket 和 [Errno 24] 打开文件过多
我在本地测试tornado.websocket的时候遇到了一个错误([Errno 24] 打开的文件太多)。
server.py
import tornado.ioloop
import tornado.web
import tornado.websocket
import tornado.options
class ChatSocketHandler(tornado.websocket.WebSocketHandler):
waiters = set()
def open(self):
ChatSocketHandler.waiters.add(self)
print "Clients: ", len(ChatSocketHandler.waiters)
def on_close(self):
ChatSocketHandler.waiters.remove(self)
@classmethod
def send_updates(cls, chat):
for waiter in cls.waiters:
try:
waiter.write_message(chat)
except:
logging.error("Error sending message", exc_info=True)
def on_message(self, message):
ChatSocketHandler.send_updates(message)
app = tornado.web.Application([
(r"/ws", ChatSocketHandler)
])
def main():
tornado.options.parse_command_line()
app.listen(8888)
tornado.ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main()
clients.py(使用 websocket-client)
from multiprocessing import Pool, Process
from websocket import create_connection
def go():
ws = create_connection("ws://127.0.0.1:8888/ws")
while True:
try:
ws.send("Message ...")
result = ws.recv()
print "Received '%s'" % result
except KeyboardInterrupt:
break
ws.close()
for i in range(1000):
Process(target=go).start()
服务器在大约800个连接后就崩溃了;/
另外一个问题:把Nginx作为代理设置到tornado服务器上可以吗?这样做有什么好处吗?
1 个回答
4
你的程序可能是因为文件描述符用完了。这里有一个关于Linux网络调优的指南,包括如何增加最大文件描述符的数量。(这个指南是针对Crossbar.io的,但对Tornado也适用。)
关于你问的“把Nginx放在Tornado前面有意义吗”:答案是肯定的。因为Tornado本身对TLS的支持有限。你可以看看Hynek Schlawack: The Sorry State of SSL - PyCon 2014这个视频。
注意:后面提到的情况不适用于Twisted(或者基于Twisted的Crossbar.io)——因为Twisted使用了pyOpenSSL,可以实现高质量的TLS。所以对于这些情况,使用Nginx就没有必要了(至少在TLS方面是这样)。