Использование синхронной библиотеки с асинхронным Discord.py

Я работаю над ботом, который передает сообщения из Steem Blockchain (используя синхронную библиотеку beem) и отправляет сообщения, которые соответствуют определенным критериям, на канал Discord (используя асинхронную библиотеку Discord.py). Это мой (упрощенный) код:

bot = commands.Bot(command_prefix="!")

async def send_discord(msg):
    await bot.wait_until_ready()
    await bot.send_message(bot.get_channel("mychannelid"), msg)

async def scan_post(post):
    """Scan queued Comment objects for defined patterns"""
    post.refresh()
    if post["author"] == "myusername":
        await loop.create_task(send_discord("New post found"))

async def start_blockchain():
    stream = map(blockchain.stream(opNames=["comment"]))
    for post in stream:
        await loop.create_task(scan_post(post))

if __name__ == '__main__':
    while True:
        loop.create_task(start_blockchain())
        try:
            loop.run_until_complete(bot.start(TOKEN))
        except Exception as error:
            bot.logout()
            logger.warning("Bot restarting "+repr(error))

Прежде чем я реализовал discord.py, я бы просто вызвал синхронную функцию scan_post(post) и это работало просто отлично, но теперь с асинхронной реализацией сообщения обрабатываются недостаточно быстро, и поток имеет быстро увеличивающуюся задержку. Если я сделаю scan_post(post) синхронная функция, время обработки в порядке, но веб-розетка Discord закрывается (или даже не открывается), и бот отключается. Как я могу решить это простым способом (без переписывания библиотеки beem)?

1 ответ

Я решил проблему: я запускаю поток beem в своем собственном потоке, а асинхронные функции - во втором. С помощью библиотеки janus я могу добавить объекты из потока луча в очередь, которая обрабатывается асинхронным потоком.

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