Проблема с торнадо / asyncio с помощью веб-сокета - PullRequest
1 голос
/ 24 сентября 2019

Я конвертирую свое приложение из Python 2 в Python 3. Вкратце, мое приложение работает на Python (сервер) и в Javascript (клиент), которые подключаются через веб-сокет, который я получаю с помощью торнадо.В Python у меня есть несколько потоков.Я нигде не использую асинхронные методы Python3.

Однако при преобразовании моего приложения из Python 2.7 (он прекрасно работает в Python2) в Python 3.7 у меня возникают проблемы с tornado / asyncio.

Во-первых, я получил сообщение об ошибке: RuntimeError: There is no current event loop in thread 'Thread-26'.

После некоторого поиска в Google я нашел рекомендацию для смягчения этого:

import tornado.platform.asyncio
import asyncio
asyncio.set_event_loop_policy(tornado.platform.asyncio.AnyThreadEventLoopPolicy())

Это, похоже, решает эту ошибку.Однако теперь я получаю следующее предупреждение + ошибка:

2019-08-24 13:27:25,455 asyncio      DEBUG    Using selector: SelectSelector
2019-08-24 13:28:25,455 asyncio      ERROR    Task was destroyed but it is pending!
task: <Task pending coro=<WebSocketProtocol13.write_message.<locals>.wrapper() running at C:\Users\DLA\PycharmProjects\myPmese\Python3\lib\site-packages\tornado\websocket.py:1102>>

Есть какие-нибудь подсказки о том, что происходит?К сожалению, я не могу найти, какая именно часть моего кода Python вызывает это.

Большое спасибо!Буду признателен за любую помощь:)

Ниже вы можете найти архитектуру моей веб-сокета Python, используя торнадо:

import tornado.platform.asyncio
import asyncio
asyncio.set_event_loop_policy(tornado.platform.asyncio.AnyThreadEventLoopPolicy())
application = tornado.web.Application([(r'/myPmese/websocket', WSocketHandler)])
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8295)
tornado.ioloop.IOLoop.instance().start()

class WSocketHandler(tornado.websocket.WebSocketHandler):

    def initialize(self):
        print('initialize') # here I initialise handlers

    def open(self):
        start_server_code()  # triggers the code from the server.

    def __call__(self, *args):
        clientCommand = self.getClientCommand()
        self.resetClientCommand()
        self.send(clientCommand , *args)

    def send(self, var_func, *args):
        try:
            self.write_message(json.dumps(self.getClientCommand()))
        except Exception as e:
            print(traceback.format_exc())

    def on_message(self, message):
        if message != '':
            try:
                eval(self.executeCommand(message))
            except Exception as e:
                print(traceback.format_exc())
                self.send('createErrorMessage', str(e))

    def on_close(self):
        tornado.ioloop.IOLoop.instance().stop()
...