Я конвертирую свое приложение из 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()