python - Microsoft Teams - 机器人主程序中的无限循环
问题描述
我开发了一个团队机器人,它在启动时运行无限循环,以便向用户发送主动消息。
async def job():
i = 60
await asyncio.sleep(i)
await _create_file_of_the_day()
await _send_question_of_the_day()
await job()
if __name__ == "__main__":
try:
loop = asyncio.get_event_loop()
t1 = loop.create_task(job())
t2 = loop.create_task((web.run_app(APP, host="localhost", port=CONFIG.PORT)))
asyncio.gather(t1,t2)
loop.run_forever()
except Exception as error:
raise error
这在本地工作,python app.py
但是当我将机器人上传到 azure 并在线测试时,无限循环没有启动,所以我发现无法主动向用户发送消息。这两种方法称为工作。第一个在 azure 上创建一个文件,第二个使用文件的内容创建两个问题,这些问题应主动发送给频道的所有成员。有谁知道如何帮助我?我需要根据时间延迟向用户发送消息,而不是响应他们的操作。这种调度不是固定的,例如我只想在工作日而不是在节假日发送消息。
谢谢大家
更新
我已经在评论中尝试了第二种解决方案,但结果总是一样的。在本地,应用程序行为正确,但在 Azure 云上,应该循环的例程似乎没有被触发。
async def job():
i = 60
await asyncio.sleep(i)
await _create_file_of_the_day()
await _send_question_of_the_day()
await job()
async def main():
runner = aiohttp.web.AppRunner(APP)
await runner.setup()
site = web.TCPSite(runner, host='localhost', port=CONFIG.PORT)
await site.start()
asyncio.create_task(job())
while True:
await asyncio.sleep(3600)
if __name__ == "__main__":
try:
asyncio.run(main())
except Exception as error:
raise error
解决方案
无法使用循环来安排消息,问题已通过使用 Azure 函数类型计时器触发器解决。此函数调用在机器人内部创建的端点,每次调用时都会执行 job() 方法。这两个链接可能有助于了解如何创建端点以及如何查询它。在代码示例中,通过单击链接给出查询,该链接可以很容易地被代码中的 GET 请求替换。
示例代码在 python 中,但通过浏览 git 文件夹,您可以找到其他编程语言的代码。
对于 Azure Function 的开发,我发现 YouTube 上的这三个视频系列非常有用。
推荐阅读
- javascript - JS 脚本在 HTML 中的位置
- python - PyCharm,每次运行程序时停止控制台清除
- unity3d - 在 Unity ARCore 中销毁锚点
- bash - 单个目录中多个 git 存储库的 Git 命令 - GIT_DIR
- java - 如何评估来自 editText 的数学表达式?
- html - 没有在标签中插入谷歌字体链接,但我仍然可以使用 Roboto?
- java - 在从 json 分配和获取值时更改名称 - Objectmapper java
- r - 用于匹配列/向量中的逗号分隔部分的 R 正则表达式
- flutter - 使用可折叠应用栏(sliverAppBar)时如何保留tabView的滚动位置?
- javascript - Javascript从具有正斜杠的字符串中删除双引号