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

使用Python(IPython)并行进行多个API调用

景理
2023-03-14

我正在使用Python(IPython

我有一个3000个唯一ID的数组,可以从API中提取数据,一次只能使用一个ID调用API。

我希望以某种方式同时拨打3组1000个电话,以加快速度。

最好的方法是什么?

提前感谢任何帮助!

共有1个答案

充阳秋
2023-03-14

如果没有更多关于你正在做什么的信息,很难确定,但是一个简单的线程方法可能是有意义的。

假设您有一个处理单个ID的简单函数:

import requests

url_t = "http://localhost:8000/records/%i"

def process_id(id):
    """process a single ID"""
    # fetch the data
    r = requests.get(url_t % id)
    # parse the JSON reply
    data = r.json()
    # and update some data with PUT
    requests.put(url_t % id, data=data)
    return data

您可以将其扩展为处理一系列ID的简单函数:

def process_range(id_range, store=None):
    """process a number of ids, storing the results in a dict"""
    if store is None:
        store = {}
    for id in id_range:
        store[id] = process_id(id)
    return store

最后,您可以相当容易地将子范围映射到线程上,以允许一些请求并发:

from threading import Thread

def threaded_process_range(nthreads, id_range):
    """process the id range in a specified number of threads"""
    store = {}
    threads = []
    # create the threads
    for i in range(nthreads):
        ids = id_range[i::nthreads]
        t = Thread(target=process_range, args=(ids,store))
        threads.append(t)

    # start the threads
    [ t.start() for t in threads ]
    # wait for the threads to finish
    [ t.join() for t in threads ]
    return store

IPython笔记本中的完整示例:http://nbviewer.ipython.org/5732094

如果您的单个任务需要的时间范围更广,那么您可能希望使用线程池,它将一次分配一个作业(如果单个任务非常小,则通常速度较慢,但在异构情况下可以保证更好的平衡)。

 类似资料:
  • 从我所读到的内容来看,Python中有两种调试代码的方法: > 使用传统调试器,如或。它支持诸如用于、用于、用于等命令,但是您不能直接访问IPython shell,这对于对象检查非常有用。 通过在代码中嵌入IPython shell来使用IPython。您可以从IPython导入嵌入,然后在代码中使用。当您的程序/脚本命中语句时,您将被放到IPython shell中。这允许使用IPython的

  • 问题内容: 根据我的阅读,有两种方法可以在Python中调试代码: 使用传统的调试器,例如或。它支持诸如for ,for ,for等命令,但是您没有直接访问IPython shell的权限,这对于对象检查非常有用。 使用 IPython的 通过嵌入代码中的一个IPython的壳。您可以这样做,然后在您的代码中使用。当您的程序/脚本命中一条语句时,您将进入IPython shell。这允许使用所有I

  • 我对Spring的靴子是陌生的,在它们到来的时候学习。我有一个关于并行API调用的快速问题。 我有一个ID数组,我将把它附加到第三方APIendpoint,发出GET请求,聚合数据,并在所有3000个调用完成后从中生成一个文件。 这里的问题是Array的大小为3000,即我预计会进行3000次调用。我觉得使用for循环并迭代超过3000次没有任何意义,而且效率较低。 有谁能给我建议一个最好、最有效

  • 我想使用Jupyter笔记本,但在进行基本导入(如导入matplotlib)时遇到困难。我想这是因为我有几个用户管理的python安装。例如: 我以前有anaconda,但是从~/anaconda目录中删除了if。现在,当我启动Jupyter笔记本时,我得到一个内核错误: 我该怎么办?!

  • 问题内容: 假设我有一个IPython会话,从中调用一些脚本: 有没有一种方法可以引入断点,从中可以从IPython检查工作区? 我记得在以前的IPython版本中可以做到这一点: 但是该子模块似乎不再可用。 假设我已经打开了IPython会话: 如何在我选择的位置停止程序并使用IPython检查我的工作区 ? 通常,我更喜欢不需要我预先指定行号的解决方案,因为我希望上面有多个这样的调用,而不必跟

  • 返回的流量 返回一个 如果您不能回答我的问题,请至少告诉我如何并行地执行多个API调用,并在WebClient中等待结果