求助:如何在block_number变化时退出while循环?
问题解决:区块号变化时退出循环
原代码的核心问题有两个:
- 内层循环里没有重新获取最新的
block_number,一旦进入循环就会无限执行插入操作,永远检测不到区块号变化 - 外层
while await asyncio.sleep(interval, True)的写法错误,asyncio.sleep返回None,这个循环条件永远不成立,循环体根本不会执行
下面是修正后的代码,完全实现你要的逻辑:
import asyncio async def main(): interval = 1 # 自定义检测间隔时间(秒) # 获取初始区块号 current_block = await get_current_block_number() # 若该函数是同步的,去掉await # 外层循环可根据需求添加终止条件,比如while some_condition while True: # 区块号未变化时持续插入数据 while True: insert_data_into_table() # 等待指定间隔后检测区块号 await asyncio.sleep(interval) new_block = await get_current_block_number() # 区块号变化则退出内层循环 if new_block != current_block: current_block = new_block break # 区块号变化后执行的操作 do_something_else() # 以下是模拟的业务函数,替换为你的真实逻辑 def insert_data_into_table(): print("执行数据插入操作") async def get_current_block_number(): # 模拟获取区块号,实际替换为调用链上接口的逻辑 import random return random.randint(1, 10) if random.random() < 0.1 else 5 def do_something_else(): print("区块号已更新,执行后续操作") asyncio.run(main())
关键说明:
- 内层循环每次等待间隔后都会重新获取最新区块号,对比初始值,变化则立即退出
- 如果
get_current_block_number是同步函数(不需要异步等待),直接去掉await即可 - 外层的
while True可以根据业务需求修改终止条件,比如添加运行次数限制、用户中断信号等
内容的提问来源于stack exchange,提问作者user20630484
相关产品推荐
相关产品推荐

