You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何在block_number变化时退出while循环?

问题解决:区块号变化时退出循环

原代码的核心问题有两个:

  1. 内层循环里没有重新获取最新的block_number,一旦进入循环就会无限执行插入操作,永远检测不到区块号变化
  2. 外层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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:55:15