Использование синхронной библиотеки с асинхронным Discord.py - PullRequest
0 голосов
/ 20 сентября 2018

Я работаю над ботом, который транслирует сообщения из цепочки блоков Steem (используя синхронную библиотеку 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 Ответ

0 голосов
/ 29 сентября 2018

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

...