【发布时间】:2021-08-15 15:58:35
【问题描述】:
下午好!我正在制作一个需要使用 Python requests 库将 10,000 张图像发布到 API 的程序。发送每个请求后,我会收到一个带有哈希(IpfsHash)的响应,我需要将其写入以下形式的字典:“Hash”:“Number”。首先,我创建了一个简单的代码(使用循环而不是使用异步)并且它有效。然后我使用 async 来加快速度。 代码如下:
import asyncio
import requests
jsonHashes = {}
responses = []
def pinToIPFS(number):
url = 'https://api.pinata.cloud/pinning/pinFileToIPFS'
par = {
'pinata_api_key': 'blabla',
'pinata_secret_api_key': 'blabla'
}
file = {'file': open(str(number) + '.jpg', 'rb')}
res = requests.post(url, headers = par, files = file)
jsonHashes[res.json()['IpfsHash']] = number
print(res.json()['IpfsHash'] + ' = ' + str(number))
async def main():
loop = asyncio.get_event_loop()
futures = []
for i in range(2):
futures = loop.run_in_executor(None, pinToIPFS, i)
for i in range(2):
jsonHashes[await futures[i].json()['IpfsHash']] = i
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
print(jsonHashes)
但是,由于某种原因,我得到了错误:
TypeError: '_asyncio.Future' object is not subscriptable
在那之后,我立即收到了对请求的回复:
QmcZR3cpeVzQ56gyWs83dRS51rtkqjyoF167paJMPrn32w = 1
QmehUERFcR6Erha6RtScDwfm1ACpZgGPrd5NNVnYWeDoH4 = 0
附:为简单起见,我设置了 2 次迭代而不是 10,000 次。
【问题讨论】:
-
将错误的完整回溯显示为问题中格式正确的文本。
-
@MichaelButscher 感谢您的回答,但我刚刚意识到我有一个错误在线:
futures = loop.run_in_executor(None, pinToIPFS, i)它必须是:futures.append(loop.run_in_executor(None, pinToIPFS, i))但我仍然得到错误:AttributeError: 'NoneType' object has no attribute 'json'因为python在接收到来自服务器的响应之前写入函数执行的结果。你知道如何解决这个问题吗? -
如果您要使用请求并在线程中运行所有内容,为什么还要使用 asyncio?为什么不使用 asyncio 感知 http 库?
-
最好用修改后的代码和完整的回溯创建一个新问题。
标签: python python-3.x async-await python-requests python-asyncio