Добрый вечер всем. Я не новичок в этом месте, но наконец решил зарегистрироваться и попросить о помощи. Я разрабатываю веб-приложение с использованием фреймворка Quart (асинхронный Flask). И теперь, когда приложение стало больше и сложнее, я решил разделить разные процедуры для разных экземпляров сервера, в основном потому, что я хочу, чтобы веб-сервер был чистым, более абстрактным и свободным от вычислительной нагрузки.
Итак, я планирую использовать один веб-сервер сервер с несколькими (при необходимости) идентичными процедурными серверами. Все серверы построены на фреймворке Quart, пока просто для простоты разработки. Я решил использовать роутер Crossbar.io и автобан, чтобы соединить все серверы вместе.
И вот тут возникла проблема. Я следил за этими сообщениями:
а>
Как я могу реализовать интерактивный клиент веб-сокета с автобаном asyncio?
Как я могу интегрировать кроссбарный клиент (python3, asyncio) с tkinter
Как отправить сообщение Autobahn / Twisted WAMP извне протокола?
Похоже, я перепробовал все возможные подходы для реализации клиента autobahn websocket в своем приложении Quart. Я не знаю, как сделать это возможным, чтобы обе вещи работали, работает ли приложение Quart, а клиент autobahn WS - нет, или наоборот.
Упрощенное приложение для моей кварты выглядит так:
from quart import Quart, request, current_app
from config import Config
# Autobahn
import asyncio
from autobahn import wamp
from autobahn.asyncio.wamp import ApplicationSession, ApplicationRunner
import concurrent.futures
class Component(ApplicationSession):
"""
An application component registering RPC endpoints using decorators.
"""
async def onJoin(self, details):
# register all methods on this object decorated with "@wamp.register"
# as a RPC endpoint
##
results = await self.register(self)
for res in results:
if isinstance(res, wamp.protocol.Registration):
# res is an Registration instance
print("Ok, registered procedure with registration ID {}".format(res.id))
else:
# res is an Failure instance
print("Failed to register procedure: {}".format(res))
@wamp.register(u'com.mathservice.add2')
def add2(self, x, y):
return x + y
def create_app(config_class=Config):
app = Quart(__name__)
app.config.from_object(config_class)
# Blueprint registration
from app.main import bp as main_bp
app.register_blueprint(main_bp)
print ("before autobahn start")
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
runner = ApplicationRunner('ws://127.0.0.1:8080 /ws', 'realm1')
future = executor.submit(runner.run(Component))
print ("after autobahn started")
return app
from app import models
В этом случае приложение застряло в цикле бегунов и все приложение не работает (не может обслуживать запросы), это становится возможным, только если я прерву цикл бегунов (автобан) нажатием Ctrl-C.
CMD после запуска:
(quart-app) user@car:~/quart-app$ hypercorn --debug --error-log - --access-log - -b 0.0.0.0:8001 tengine:app
Running on 0.0.0.0:8001 over http (CTRL + C to quit)
before autobahn start
Ok, registered procedure with registration ID 4605315769796303
после нажатия ctrl-C:
...
^Cafter autobahn started
2019-03-29T01:06:52 <Server sockets=[<socket.socket fd=11, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 8001)>]> is serving
Как сделать так, чтобы приложение Quart работало вместе с клиентом автобана неблокирующим образом? Таким образом, автобан открывается и поддерживает соединение через веб-сокет с маршрутизатором Crossbar и молча прослушивает в фоновом режиме.