【问题标题】:Sheduled function call doesn't work. How to fix it? Python, aiogram计划的函数调用不起作用。如何解决? Python, aiogram
【发布时间】:2022-12-20 22:08:02
【问题描述】:

我目前正在编码一个电报机器人,它需要每分钟检查站点是否有新交易。我正在使用以下代码执行此操作:

async def check(wait_for):
    while True:
        logging.warning(1)
        await asyncio.sleep(wait_for)
        logging.warning(2)
        transactions = parsing()
        if transactions: ...

这是我需要调用的函数(logging.warnings 是某种调试)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.create_task(check(60))
    start_webhook(...

我就是这样称呼它的。但是有一个问题:它所做的一切都是在 webhook 启动之前记录 1:

2022-08-20T22:48:17.444445+00:00 app[web.1]: WARNING:root:1
2022-08-20T22:48:17.554609+00:00 app[web.1]: WARNING:aiogram:Updates were skipped successfully.
2022-08-20T22:48:17.634728+00:00 app[web.1]: ======== Running on http://0.0.0.0:22044 ========
2022-08-20T22:48:17.634735+00:00 app[web.1]: (Press CTRL+C to quit)...

换句话说,我的函数中“await asyncio.sleep(wait_for)”之后的所有内容都不会执行。为什么?

【问题讨论】:

    标签: python aiogram


    【解决方案1】:

    您的检查功能应该在等待睡眠功能之前进入睡眠状态,然后在检查功能处于睡眠状态时,webhook 功能将启动。

    async def check(wait_for):
        while True:
            await asyncio.sleep(wait_for)
            logging.warning(1)
            logging.warning(2)
            transactions = parsing()
            if transactions: ..
    

    【讨论】:

    • 呃,我不太明白你所说的“函数应该休眠”是什么意思。我试过你的代码,结果是一样的,但是日志中没有“1”,因为你把它移到了 await 旁边。
    【解决方案2】:

    看起来您需要保存对刚刚创建的任务的引用(create_task 返回一个任务对象),以防止它被垃圾收集,因为 event_loop 本身只存储一个弱引用。只需在文件的开头创建一些全局变量 alltasks = set() 和 alltasks.add() 所有任务。

    信息:您可能应该将任务集中在一起,并安排它们在调用 asyncio.run() 时运行。如果您正在构建一个更大的项目,我建议您阅读有关 asyncio 任务和事件循环的文档。 (asyncioasyncio taskasyncio eventloop)

    alltasks = set()
    
    if __name__ == '__main__'
         loop = asyncio.get_event_loop()
         new_task = loop.create_task(check(60))
         alltasks.add(new_task)
        ...
    

    编辑:如果它仍然不起作用,您可能正在某处关闭/替换事件循环。

    【讨论】:

    • 感谢您的回复,但它并没有解决我的问题。使用 new_task = loop.create_task(check(60)) 然后将其添加到 set 时,没有任何变化。 asyncio.run 阻止 webhook 启动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2023-02-07
    • 1970-01-01
    • 2021-06-26
    • 2013-12-30
    相关资源
    最近更新 更多