首页 > 解决方案 > 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

标签: pythonazurebotframeworkpython-asyncioinfinite-loop

解决方案


无法使用循环来安排消息,问题已通过使用 Azure 函数类型计时器触发器解决。此函数调用在机器人内部创建的端点,每次调用时都会执行 job() 方法。这两个链接可能有助于了解如何创建端点以及如何查询它。在代码示例中,通过单击链接给出查询,该链接可以很容易地被代码中的 GET 请求替换。

具有端点创建的主动消息示例

带有主动消息解释的文章

示例代码在 python 中,但通过浏览 git 文件夹,您可以找到其他编程语言的代码。

对于 Azure Function 的开发,我发现 YouTube 上的这三个视频系列非常有用。

在 python 中开发定时器触发功能的有用视频


推荐阅读