并发API调用

1 投票
1 回答
3613 浏览
提问于 2025-04-17 14:17

我有大约14万次一次性的API调用需要进行,但问题是每次调用大约需要15秒。如果一个接一个地做,这大概需要25天的时间。不过,我希望能更快地完成这些调用。

我打算把返回的数据放进一个MySQL数据库里,使用JSON解析器和一个处理解析后数据的函数。我对Python和PHP都比较熟悉。

有什么好的方法(也就是最快、最简单的实现方式)可以同时进行多个API调用,并把返回的数据解析到数据库里吗?

1 个回答

1

你可能需要尝试一下多线程或多进程。

这只有在API允许多个并行调用的情况下才有用(而且运行API的机器必须足够快,能同时处理多个请求)。

如果瓶颈不在你的CPU上,你可以直接使用 threading 模块,因为 multiprocessing 不会带来更多的提升。

如果你想试试没有检查的代码,可以看看:

import Queue
import threading

number_of_API_readers = 10

parameters_queue = Queue.Queue()
results_queue = Queue.Queue(100)

for par in list_of_parameters:
    parameters_queue.put(par)

def read_from_queue_and_write_to_db():
    while True:
        try:
            result = results_queue.get(timeout=30)
            #write result to DB
        except Queue.Full:
            break

def query_API_and_write_to_queue():
    while True:
        try:
            par = parameters_queue.get(timeout=5)
            result = SomeAPI.call(par)
            results_queue.put(result)
        except Queue.Empty:
            break

db_writer = threading.Thread(target=read_from_queue_and_write_to_db)
api_readers = [threading.Thread(target=query_API_and_write_to_queue) 
                for i in range(number_of_API_readers)]

db_writer.start()
for ar in api_readers:
    ar.start()

这段代码的主要思路是:

  • 有一个线程负责写入数据库
  • 有很多线程,比如10个,负责查询API
  • 使用(线程安全的)队列来同步这些线程。

撰写回答