【问题标题】:tornado.websocket and [Errno 24] Too many open filestornado.websocket 和 [Errno 24] 打开的文件太多
【发布时间】:2014-08-08 09:26:18
【问题描述】:

我在本地机器上测试 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 次连接后服务器死机;/

附加问题:可以为 tornado 服务器实例设置 Nginx 代理吗?我能得到一些好处吗?

【问题讨论】:

    标签: python websocket tornado


    【解决方案1】:

    您的进程可能会用完文件描述符。 Here 是在 Linux 上进行网络调整的秘诀,包括如何增加最大值。 FD。 (这适用于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 的原因)。

    【讨论】:

    • 如果我没记错的话,将 ngnix 放在 tornado 前面是否会增加 tornado 处理开放 websocket 连接的限制和能力?
    • 不,不会。它会遇到同样的问题。
    猜你喜欢
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多