【问题标题】:Tornado server stuck in loop, not accepting clientsTornado 服务器卡在循环中,不接受客户端
【发布时间】:2013-07-11 00:00:42
【问题描述】:

我在 tornado 中编写了一个代码,该代码连接到正在推送无限数据流的服务器,处理数据流并将其发送到 websocket 服务器上。 问题是我实现它的方式服务器在特定功能上被阻塞并且不再接受任何客户端,因为它永远不会退出向websocket提供数据的功能。我希望与服务器的连接和从中检索的数据只处理一次,但将处理后的数据发送到连接到我的龙卷风服务器的所有客户端。有人可以帮我吗,我想不出办法。这是我删除数据处理的代码:

import socket
import ssl
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web

websockets = []

class WSHandler(tornado.websocket.WebSocketHandler):


  def readData(self):
    while True:
        line = self.ssl_sock.read()

        #PROCESS THE READ LINE AND CONVERT INTO RESULTING DATA


        if(toSend):
                self.write_message(result)

  def makeConnection(self):
      self.ssl_sock.connect(self.address)
      self.readData()



  def open(self):
    print 'New connection was opened'
    self.s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.ssl_sock=ssl.wrap_socket(self.s, cert_reqs=ssl.CERT_NONE)
    self.address=('SERVER_ADDRESS',5000)
    self.nodes=[]
    self.edges=[]
    if self not in websockets:
        print ('added')
        websockets.append(self)

    if(len(websockets)==1):
        print('executing make conn')
        self.makeConnection()
    else:
        self.readData()
        print('executing read data')


  def on_message(self, message):
    print 'Incoming message:', message
    self.write_message("You said: " + message)

  def on_close(self):
    print 'Connection was closed...'


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

if __name__ == "__main__":

  http_server = tornado.httpserver.HTTPServer(application)
  http_server.listen(8888)
  tornado.ioloop.IOLoop.instance().start()

【问题讨论】:

  • 我阅读了您发送的示例。我不完全明白。这家伙是如何连接到 API 并获取数据的?
  • 他将所有已连接的客户端存储在cl 列表中。每当调用api 方法时,他就可以在那里处理数据,然后遍历连接到服务器cl 的所有客户端并向所有客户端发送响应,这就是您要实现的目标吗?
  • 我明白了。在我的情况下,我连接到我的 TLS 服务器,该服务器不断发出一个数据流,该数据流通过这个 webSocket 处理程序处理和发送出去。在我的情况下,我应该如何调用在不阻塞服务器的情况下无限读取和处理数据的函数?

标签: python stream websocket tornado infinite


【解决方案1】:

Tornado 是一个异步框架,也就是说,你所有的 IO 都必须在它的事件循环中运行,否则整个服务器都会卡住。

试试看Tornado Async Client

【讨论】:

    猜你喜欢
    • 2014-07-21
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多