舍杜德函数调用不起作用。如何解决?Python, aiogram



我目前正在编写一个电报机器人程序,它需要每分钟检查一次网站上的新交易。我使用以下代码来完成此操作:

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_fo(";在我的职能从来没有执行。为什么?

您的check函数在等待sleep函数之前应该先休眠,然后在check函数休眠时,webhook函数将启动。

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

您似乎需要保存对刚刚创建的Task的引用(create_Task返回Task对象(,以避免其被垃圾收集,因为event_loop本身只存储弱引用。只需在文件开头创建一些全局变量alltasks=set((,然后创建alltasks.add((即可。

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

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

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

最新更新