【问题标题】:How to test Max Open Websocket Limit in Tornado ( Python ) Server如何在 Tornado ( Python ) 服务器中测试 Max Open Websocket 限制
【发布时间】:2014-10-08 01:40:39
【问题描述】:

我正在尝试获取到 websockets 服务器的最大打开连接数。我在 Python 中有简单的代码。这给了我 28K 的开放连接,但我认为服务器或客户端代码可能有问题。

Server.py

#!/usr/bin/env python

import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web

class WSHandler(tornado.websocket.WebSocketHandler):
    clients = []

    def open(self):
        self.clients.append(self)
        print 'new connection'
        self.write_message("Hello World")

    def on_message(self, message):
        print 'message received %s' % message

    def on_close(self):
        #self.clients.remove(self)
        pass
        #print 'closed connection'

application = tornado.web.Application([
    (r'/ws', WSHandler),
])


if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application,no_keep_alive=False)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

客户

#!/usr/bin/env python

"""
Connect websockets in concurrency, 
each connection should be open until last connection made and 
server did not response 
"""

import sys
import gevent
from gevent import monkey
from websocket import create_connection



#------------
# Functions 
#------------
def send_hello(n):
    my_count = 0
    while True:
        ws = create_connection(ws_link)
        ws.send("Hello World")
        recv = ws.recv()
        if recv:
           print "-----------------------"
           print "I'm Connection : %r" % n
           print "Sending 'Hello World'"
           print "Received : %s" % recv
           my_count = my_count + 1 
           #ws.close()  # Do not close the connections,
                     # Let's see how much server can handle.. 
           print "I've sent %r messeges to server" % my_count
           print "-----------------------"


if __name__ == '__main__':
    if len(sys.argv) != 3:
        print "\nUsage:\n\t %r <ws_link> <number_of_connection>\n" % sys.argv[0]
        sys.exit(1) 
    ws_link, number_of_connections = sys.argv[1:]
    # patches stdlib to cooperate with other greenlets
    #monkey.patch_thread()
    try:
       monkey.patch_all()
       jobs = [ gevent.spawn(send_hello,i) for i in range(int(number_of_connections)) ]
       gevent.wait(jobs)
    except Exception as e:
       print "Error : %r" % e
       sys.exit(1)

【问题讨论】:

    标签: python websocket tornado


    【解决方案1】:

    一个问题是您需要一个全局客户列表。您的服务器代码当前为每个仅包含自身的客户端都有一个客户端列表。

    所以:

    #!/usr/bin/env python
    
    import tornado.httpserver
    import tornado.websocket
    import tornado.ioloop
    import tornado.web
    clients = []
    
    class WSHandler(tornado.websocket.WebSocketHandler):
    
    
        def open(self):
            clients.append(self)
            print 'new connection'
            self.write_message("Hello World")
    
        def on_message(self, message):
            print 'message received %s' % message
    
        def on_close(self):
    
            clients.remove(self)
            pass
            #print 'closed connection'
    
    application = tornado.web.Application([
        (r'/ws', WSHandler),
    ])
    
    
    if __name__ == "__main__":
        http_server = tornado.httpserver.HTTPServer(application,no_keep_alive=False)
        http_server.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    

    【讨论】:

    • 这其实不是真的。 clients 在类评估时被初始化,因此这根本不是一个因素。 self.clients.append 没有错。不过,如果将其大写以表示类变量会更好。
    • 这是错误的,请检查一下您是否曾经在列表中拥有超过 2 个客户。 self.clients 指定实例变量,因为self 指定实例。所以不能工作。试试我建议的解决方案,看看它是否有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多