Совмещение 2-х асинхронных библиотек Python
пытаюсь написать скрипт, в котором должны работать 2 асинхронные библиотеки: websockets и aiogram. websockets создает соединение для wws api, a aiogram по совместительству должен быть еще и producer для него, буду благодарен за совет или указание ошибок.
import asyncio
import websockets
from aiogram import Bot, Dispatcher, executor, types
API_TOKEN = ''
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
#Обычный handler для приема любых сообщений
@dp.message_handler()
async def send_welcome(message: types.Message):
await bot.send_message(message.chat.id, message.text)
#Здесь начинается websocket
#Цикл для ожидания сообщения для отправки в API
async def producer_handler(websocket):
while True:
message = #producer() сдесь должен быть прерывание от телеграм
await websocket.send(message)
#Цикл для чтения сообщений от API
async def consumer_handler(websocket):
async for message_wws in websocket:
print(message_wws)
#Сама петля с 2мя задачами, если нет прерывания от ввода, выполняется чтение
async def consume():
websocket_resource_url = f"wss://ws.blockchain.info/inv"
async with websockets.connect(websocket_resource_url) as websocket:
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()
#Здесь я пытаюсь запустить 2 незавершающихся петли паралельно(пробывал все из официальной документации, ставил их как задачи и все равно не понял)
async def main():
await asyncio.gather(consume(), executor.start_polling(dp, skip_updates=True))
if __name__ == "__main__":
asyncio.run(main())
Ошибка в основном:
RuntimeError: This event loop is already running
sys:1: RuntimeWarning: coroutine 'Executor._startup_polling' was never awaited
sys:1: RuntimeWarning: coroutine 'Executor._shutdown_polling' was never awaited
Ответы (1 шт):
Автор решения: Андрій Панчій
→ Ссылка
У меня была такая же проблема, попробуйте:
# --- Ваш код ---
if __name__ == "__main__":
dp.loop.create_task(consume())
executor.start_polling(dp, skip_updates=True)
Только позже у меня возникла после этого уже другая ошибка: asyncio.exceptions.timeouterror