当前位置: 首页 > 知识库问答 >
问题:

(Python)我如何应用异步在而循环与累加器?

戚京
2023-03-14

我有一段代码,可以很好地将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”,但这对我来说仍然是一个挑战。有人能帮我吗?

共有1个答案

戚默
2023-03-14

问题是请求不是异步代码,所以它的每个网络调用都会阻塞循环,直到完成。

https://docs.python-requests.org/en/latest/user/advanced/#blocking-or-non-blocking

因此,最好尝试异步库,例如aiohttp:

https://github.com/aio-libs/aiohttp

 类似资料:
  • 问题内容: 列表中的每封电子邮件都将发送到服务器,并从服务器获得响应(如果它是有效的电子邮件)。 因此,在检查完所有电子邮件之后,数组应具有: 循环发送电子邮件到服务器的代码如下: 但是问题在于调用是异步的,因此,假设i = 0,则当i为0时控件将不会进入函数。因此,当i进入函数时,i的值可以是任何值,通常大于数组的长度,因此isEmailValidList [i]未定义。如果呼叫是同步的,则它将

  • 问题内容: 我是这个Node.js的新手..我对此回调有点困惑..在我的应用程序中,我在for循环内调用异步函数调用,我想我的问题是在得到异步调用响应之前, for循环被循环。 我的代码: 搜索功能代码: 我想在成功执行1个搜索功能后执行for循环,我想我必须使用async for loop。请指导我解决此问题。 问题答案: 我将您的代码示例简化为以下几行,以使您更容易理解该概念。 先前代码的问题

  • 我对一个异步函数有点拘泥于此。 我要完成的是创建一个batchProcessing函数(batchGetSubs),它将循环访问一组文件,读取一个ID,然后发出一个API请求,等待一个响应(问题),然后用格式化的数据写入一个新文件。 问题--我尝试了异步和等待,以及推送承诺和尝试使用承诺.所有这些都是为了等待承诺的解决,但没有成功。当前的行为是,在API调用实际返回所有数据之前,我获取Promis

  • 我想链接一个在循环中多次调用的异步ajax函数。为什么?因为这个功能是上传文件,但我希望它能连续上传文件,而不是一次上传所有文件。我不想使用async false,因为我希望在DOM上更新进度。 我不明白jquery延迟对象是如何工作的。

  • 问题内容: 通常我们这样编码: 但是也可以按照以下方式做一些事情: 我想要这样做的真正原因是因为我想使用python-progressbar的自动检测maxval。他们喜欢 问题答案: 您可以与callable一起使用。(您应该传递两个参数,一个用于可调用对象,另一个用于前哨值) 注意 当没有剩余元素并且没有放置哨兵值时,它将阻塞。另外,就像-循环,并且与普通的容器循环不同,它将从队列中删除项目。

  • 问题内容: 我如何访问传递给fs.lstat函数的变量? 问题答案: 这是使用而不是for循环迭代值的完美理由。 另外,您可以使用@Aadit建议的闭包: