我目前正在编写一个电报机器人程序,它需要每分钟检查一次网站上的新交易。我使用以下代码来完成此操作:
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)
...
编辑:如果事件循环仍然不起作用,您可能正在关闭/替换它。