【问题标题】:BotBuilder display message while waiting for blocking functionBotBuilder 在等待阻塞功能时显示消息
【发布时间】:2021-04-20 05:03:10
【问题描述】:

我正在尝试按照this guide 在 Python 中使用 Microsoft 的 Bot 框架构建一个机器人。在等待阻塞函数返回时,我不知道如何显示消息。我已经阅读了一般的 async 和 await ,但没有找到任何特定于 Bot Framework 的示例。这是一个简单的例子。使用此代码,它会在显示两条消息之前等待 2 秒。我想立即确认用户输入,然后等待一个长时间的阻塞函数并返回结果。

class MyBot(ActivityHandler):
    async def on_message_activity(self, turn_context: TurnContext):
        start = time.time()

        elapsed = time.time() - start
        await turn_context.send_activity(f"Message received after {elapsed:.1f} seconds")

        await self._blocker()

        elapsed = time.time() - start
        await turn_context.send_activity(f"Finished after {elapsed:.1f} seconds!")
        
    
    async def _blocker(self):
        time.sleep(2)

完整的源代码可通过上述指南获得,或直接从here 获得。我只更改了 MyBot 类。

【问题讨论】:

  • 您想将信息发送给用户....正在等待您的类似消息
  • 这让我很困惑。我玩了一下,如果我从函数中删除异步关键字,你提到的行为似乎就是我得到的。但是如果你的函数中有关键字,如果在没有等待的情况下调用它,你应该会得到一个语法错误。我有根据的猜测是,这与转弯处理程序如何调用类有关,因为代码本身似乎工作正常。抱歉,我帮不上什么忙,但也许这可以帮助您思考解决方案。
  • @ElliottB - 你的代码没有明显的问题,所以我看到了两种可能性。问题可能出在您未向我们展示的代码的某些部分(例如适配器),或者问题可能出在客户端。至少您应该让我们知道您正在使用哪个频道,但您可能还想向我们展示更完整的代码示例。 (由于这个帖子里还有很多人,如果你想让我看到你的回复,你需要@提及我。)
  • @KyleDelaney 抱歉,我之前写错了链接。我用完整源代码的链接更新了问题,这是微软的一个模板。我正在使用 Bot Framework Emulator 4.12
  • @ElliottB - 当有人问你正在使用什么频道时,请不要说模拟器。如果我们帮助您找到仅在模拟器中有效而在您实际想要使用的频道中无效的解决方案怎么办?当人们试图帮助你时,你为什么不想坦诚相待?

标签: python botframework


【解决方案1】:

事实证明,这毕竟是一个模拟器问题,与 Bot Builder Python SDK 无关。我在这里报告了这个错误:https://github.com/microsoft/BotFramework-Emulator/issues/2262

起初我认为问题在于您使用的是time.sleep 而不是asyncio.sleep。虽然这不是您的问题,但在编写异步代码时您仍然应该更喜欢 asyncio.sleepPython 3.7 - asyncio.sleep() and time.sleep()

您现在可以放心地忽略该问题。将来,请始终记住在您的目标通道上进行测试,因为您不能假设模拟器会以相同的方式运行。

【讨论】:

  • 感谢您的调查!我真的不打算使用time.sleep,这只是一个模仿其他同步任务行为的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 2011-06-17
  • 2020-11-01
相关资源
最近更新 更多