簡體   English   中英

Tornado的WebsocketClientConnection的close方法不會調用Websocket Handler的on_close方法

[英]close method of Tornado's WebsocketClientConnection doesn't invoke on_close method of Websocket Handler

我有一個像這樣的WebsocketHandler:

class MyHandler(WebSocketHandler):

    def open(self, *args, **kwargs):
        self.application.logger.info('WebSocket connection opened from %s', self.request.remote_ip)

    def on_close(self):
        self.application.logger.info('WebSocket connection closed')

    def on_message(self, message):
        self.write_message(message)

我有一些使用pytest的測試,如下所示:

@pytest.fixture
def app(request):
    request.cls.app_fixture = create_app(TornadoConfig)


@pytest.mark.usefixtures("app")
class TestWebSocket(testing.AsyncHTTPTestCase):

    def get_app(self):
        return self.app_fixture

    def setUp(self):
        super(TestWebSocket, self).setUp()
        server = httpserver.HTTPServer(self.app_fixture)
        self.socket, self.port = testing.bind_unused_port()
        server.add_socket(self.socket)

    def _mk_client(self):
        client = websocket_connect('ws://localhost:{}/ws/'.format(self.port))
        TestWebSocket.clients.append(client)
        return client

    @testing.gen_test
    def test_auto_complete(self):
       client = yield self._mk_client()
       client.write_message('test')
       response = yield client.read_message()

       assert response == 'test'

       client.close()

雖然我跟蹤了它,並且確定可以調用close方法,但是client.close()MyHandler沒有任何影響,並且永遠不會調用on_close

client.close() 導致MyHandler.on_close被調用,但尚未被調用,並且當測試方法返回時,它永遠不會有機會。 如果要確保調用了on_close則必須等待on_close被調用,而不是在client.close()返回后立即返回。 請參閱例如Tornado對websocket功能的測試: https : //github.com/tornadoweb/tornado/blob/43e23f977715396ce243c6cd7e3387abf2a2e4ee/tornado/test/websocket_test.py#L44

我使用ThreadPoolExecutor解決了我的問題,所以我創建了一個thread_pool

thread_pool = ThreadPoolExecutor(1)

並編寫了另一個關閉客戶端連接的方法:

def close_ws(self, client):
    client.close()
    time.sleep(1)
    self.close_future.set_result('done')

在測試方法的最后,我做了:

self.thread_pool.submit(self.close_ws, client)
yield self.close_future

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM