如何在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
相关产品推荐
相关产品推荐

