おそらく、マルチスレッド/マルチプロセッシングを試す必要があります。
これは、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()
このコードの主なアイデア:
- データベースに書き込むスレッドが 1 つある
- API をクエリするスレッドが 10 個など、多数ある
- (スレッドセーフな) キューを使用してスレッドを同期します。