Насколько я понял, вы пытаетесь опрашивать базу данных и выводить изменения, а BSession.GetData() как раз данные из базы получает с помощью SQLAlchemy.
Во-первых, обращение к базе синхронное и в моменты выполнения запросов будет ставить колом все установленные websocket-соединения. Использовать для решения это проблемы можно
sqlalchemy_aio или
SQLAlchemy+aiopg. А ещё лучше
asyncpg без SQLAlchemy.
Во-вторых, чтобы пользователи не получали каждый раз всё содержимое базы, стоит хранить где-нибудь последний извлечённый id и запрашивать из базы только записи, у которых id больше.
Наконец, что касается организации двусторонней асинхронности, должен помочь немного модифицированный вариант из
документации:
async def consumer_handler(websocket, path):
while True:
message = await websocket.recv()
# делаем что-нибудь с сообщением от клиента
async def producer_handler(websocket, path):
while True:
data = await BSession.GetData()
if data:
await websocket.send(data)
async def handler(websocket, path):
consumer_task = asyncio.ensure_future(consumer_handler(websocket))
producer_task = asyncio.ensure_future(producer_handler(websocket))
done, pending = await asyncio.wait(
[consumer_task, producer_task],
return_when=asyncio.FIRST_COMPLETED,
)
for task in pending:
task.cancel()
loop = asyncio.get_event_loop()
loop.run_until_complete(websockets.serve(handler, 'localhost', 8765))
loop.run_forever()