2017-01-24 6 views
0

竜巻Webサーバーコードでは、SSLIOStreamはIOStreamから継承し、BaseIOStreamクラスを継承します。 BaseIOStreamには、竜巻サーバーを起動する場所からのmax_write_buffer_sizeがあります。私は設定する環境変数の使用が見つかりませんでした、それはコンストラクタパラメータとして渡される必要があります。竜巻のBaseIOStreamクラスオブジェクトでmax_write_buffer_sizeを設定する方法は?

答えて

0

source codeから、max_write_buffer_sizeはプライベート変数ではないことがわかります。したがって、BaseIOStreamオブジェクトまたはBaseIOStreamを継承するクラスSSLIOStreamおよびIOStreamのオブジェクトのいずれかからアクセスできます。例えばので

:使用が制限されており、おそらくデフォルト値は右の1(無制限)ですので

import socket 
import tornado.ioloop 
import tornado.iostream 
import tornado.options 

# def connect_baseiostream(): 
# sock = socket.socket() 
# stream = tornado.iostream.BaseIOStream(sock) 
# stream.max_write_buffer_size = 10000 # Set max_write_buffer_size 

def connect_iostream(): 
    sock = socket.socket() 
    stream = tornado.iostream.IOStream(sock) 
    stream.max_write_buffer_size = 10000 # Set max_write_buffer_size 
    stream.connect(host, port) # Defined host and port 

def main(): 
    tornado.options.parse_command_line() 
    tornado.ioloop.IOLoop.instance().add_callback(connect_iostream) 
    tornado.ioloop.IOLoop.instance().start() 

if __name__ == "__main__": 
    main() 
0

このパラメータは、HTTPサーバで公開されていません。もちろん、その問題を作成してgithubで議論することもできます。もう1つの解決策は、をサブクラス化してTCPServer's handle_connectionの独自の実装(プライベート_の方法に留意してください)です。

from tornado.httpserver import HTTPServer 

max_write_buffer_size = 65535 

class CustomHTTPServer(HTTPServer): 

    def _handle_connection(self, connection, address): 
    # https://github.com/tornadoweb/tornado/blob/master/tornado/tcpserver.py#L257 
      if self.ssl_options is not None: 
       assert ssl, "Python 2.6+ and OpenSSL required for SSL" 
       try: 
        connection = ssl_wrap_socket(connection, 
               self.ssl_options, 
               server_side=True, 
               do_handshake_on_connect=False) 
       except ssl.SSLError as err: 
        if err.args[0] == ssl.SSL_ERROR_EOF: 
         return connection.close() 
        else: 
         raise 
       except socket.error as err: 
        if errno_from_exception(err) in (errno.ECONNABORTED, errno.EINVAL): 
         return connection.close() 
        else: 
         raise 
      try: 
       if self.ssl_options is not None: 
        stream = SSLIOStream(connection, io_loop=self.io_loop, 
             max_buffer_size=self.max_buffer_size, 
             read_chunk_size=self.read_chunk_size, 
             max_write_buffer_size=max_write_buffer_size) 
       else: 
        stream = IOStream(connection, io_loop=self.io_loop, 
            max_buffer_size=self.max_buffer_size, 
            read_chunk_size=self.read_chunk_size, 
            max_write_buffer_size=max_write_buffer_size) 

       future = self.handle_stream(stream, address) 
       if future is not None: 
        self.io_loop.add_future(gen.convert_yielded(future), 
              lambda f: f.result()) 
      except Exception: 
       app_log.error("Error in connection callback", exc_info=True) 

およびカスタマイズされたサーバーを使用します。

application = web.Application([ 
     (r"/", MainPageHandler), 
    ]) 
    http_server = CustomHTTPServer(application) 
    http_server.listen(8080) 
    ioloop.IOLoop.current().start() 
関連する問題