运行并发API调用

时间:2013-01-31 06:34:18

标签: php python mysql api

我需要做大约140,000个一次性API调用,问题是它们都需要大约15秒。这需要大约25天才能连续完成,但是,我希望能更快地完成它。

我打算使用JSON解析器和获取解析数据的函数将返回的数据转储到MySQL数据库中。我熟悉Python和PHP。

同时执行大量API调用并将返回的项解析为数据库的最佳方法(最快,最简单)是什么?

1 个答案:

答案 0 :(得分: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()

此代码中的主要想法:

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