Санитарный цикл событий и автобан

У меня есть проект, написанный с Sanic

application = Sanic(__name__)
...
application.run(host=application.config.HOST, port=application.config.PORT,
                debug=application.config.DEBUG, log_config=application.config.LOG)

и мой сайт имеет раздел для операций в реальном времени

для раздела в реальном времени я хочу использовать автобан с Sanic Loop

и у меня есть собственный протокол чата

class ChatServerProtocol(WebSocketServerProtocol):
    ....

и чат фабрики:

class ChatFactory(WebSocketServerFactory):
    ...

и я получаю санитарный цикл событий и устанавливаю фабрику в ChatFactory

async def after_server_start(app, loop):
    factory = ChatFactory(u"ws://127.0.0.1:9000")
    factory.protocol = ChatServerProtocol

    loop.set_task_factory(factory)

Приведенный выше код не работает:

Error: Bad Request
Traceback (most recent call last):
  File "httptools/parser/parser.pyx", line 296, in httptools.parser.parser.cb_on_message_complete (httptools/parser/parser.c:4868)
File "/Users/XXX/Documents/Projects/sanic_env/lib/python3.6/site-packages/sanic/server.py", line 227, in on_message_complete
self.execute_request_handler()
File "/Users/XXX/Documents/Projects/sanic_env/lib/python3.6/site-packages/sanic/server.py", line 234, in execute_request_handler
self.stream_response))
File "uvloop/loop.pyx", line 1146, in uvloop.loop.Loop.create_task (uvloop/loop.c:24809)
TypeError: __call__() takes 1 positional argument but 3 were given

и вопросы:

A: я могу использовать цикл событий Sanic для автобана?

‌B: Если да, как это должно быть сделано?

1 ответ

Хммм. Это сложный вопрос, чтобы ответить. Ответ сейчас: не уверен.

Если вы посмотрите на autobahn-python, то он указывает, что для twisted / asyncio не было упоминания о uvloop. Хотя я мог бы добавить, я думаю, что выпадение uvloop для asyncio должно быть возможным, если вы посмотрите на это обсуждение с моим коллегой, который говорит об этом в crossbar.io: https://github.com/crossbario/autobahn-python/issues/925.

В соответствии с вышеупомянутой проблемой 925 вам нужно создать новый цикл обработки событий var, чтобы подключиться к uvloop.

Сам не пробовал, так что надеюсь, что это поможет.

Другие вопросы по тегам