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

如何在web3py中正确使用AsyncHTTPProvider解决coroutine调用错误

问题原因

你遇到的报错是因为Web3 v5版本中,直接通过Web3()构造的实例默认绑定同步API模块,哪怕传入异步Provider,调用w3.eth下的方法时依然会走同步请求逻辑,和你观察到的调用了request_blocking方法的现象完全一致。

解决方案

方案1:Web3 v5版本适配(保持你当前使用的5.x版本)

通过Web3实例的asynchronous属性获取专门的异步实例即可,这也是官方测试用例中async_w3对象的实际来源。
正确代码示例:

import asyncio
from web3 import Web3

async def main():
    # 先初始化带AsyncHTTPProvider的基础实例
    base_w3 = Web3(Web3.AsyncHTTPProvider("http://127.0.0.1:8545"))
    # 获取异步实例,所有eth下的API都支持await调用
    async_w3 = base_w3.asynchronous
    
    coinbase = await async_w3.eth.coinbase
    print(coinbase)
    # 其他异步调用示例
    balance = await async_w3.eth.get_balance(coinbase)
    print(f"账户余额: {async_w3.from_wei(balance, 'ether')} ETH")

if __name__ == "__main__":
    asyncio.run(main())

方案2:升级到Web3 v6及以上版本

v6版本新增了专门的AsyncWeb3类,异步调用逻辑更直观,不需要额外获取asynchronous属性:

import asyncio
from web3 import AsyncWeb3, AsyncHTTPProvider

async def main():
    # 直接初始化异步Web3实例
    w3 = AsyncWeb3(AsyncHTTPProvider("http://127.0.0.1:8545"))
    coinbase = await w3.eth.coinbase
    print(coinbase)

if __name__ == "__main__":
    asyncio.run(main())

内容的提问来源于stack exchange,提问作者Ramgos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:45:03