我正在开发一个机器人,它从 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 库)?