0

我正在开发一个机器人,它从 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 websocket 关闭(或者甚至没有打开)并且机器人离线。如何以简单的方式解决这个问题(无需重写 beem 库)?

4

1 回答 1

1

我解决了这个问题:我在自己的线程中运行 beem 流,在第二个线程中运行异步函数。然后,使用janus库,我可以将来自梁线程的对象添加到由异步线程处理的队列中。

于 2018-09-29T15:25:59.547 回答