【发布时间】:2021-12-07 15:11:39
【问题描述】:
我有一段代码可以很好地从 API 请求获取数据到特定站点。问题是该站点每次调用只给我 50 个对象的限制,而且我必须进行多次调用。结果,我花了很长时间才完成抓取工作(有时我不得不等待近 20 分钟)。这是我的代码:
import concurrent.futures
import requests
supply = 3000
offset = 0
token_ids = []
while offset < supply:
url = "url_1" + str(offset)
response = requests.request("GET", url)
a = response.json()
assets = a["assets"]
def get_token_ids(an):
if str(an['sell_orders']) == 'None' and str(an['last_sale']) == 'None' and str(an['num_sales']) == '0':
token_ids.append(str(an['token_id']))
with concurrent.futures.ThreadPoolExecutor() as executor:
results = [executor.submit(get_token_ids, asset) for asset in assets]
offset += 50
print(token_ids)
问题在于代码运行并等待所有操作完成,然后再发出另一个请求。我正在考虑一个改进,当请求发送时,偏移值被添加,循环处理另一个请求,因此我不必等待。我不知道该怎么做,我学习了'asyncio',但这对我来说仍然是一个挑战。谁能帮我解决这个问题?
【问题讨论】:
-
您测量过请求所需的时间吗?这是一个网络事务,在您的代码中,您只执行其中的 60 个。 20 分钟对于 60 个 URL 获取来说是很长的时间。如果您只是进行 60 次获取并跳过处理代码,那需要多长时间?您测量过执行
get_token_ids所需的时间吗?它看起来有点像字符串操作,所以我希望它会非常快。我怀疑使用 ThreadPoolExecutor 根本没有帮助你。除非我知道程序的时间花在哪里,否则我不会尝试优化程序的性能。
标签: python multithreading loops python-asyncio