2017-09-10 7 views
0

私はforループを使って配列を繰り返します。配列内の各項目について、django-rest-framework要求を行う関数を呼び出します。各関数呼び出しは他の関数呼び出しとは独立しています。ループを最適化してdjango-rest-frameworkリク​​エストを作成する

アレイに25個の項目がある場合、現在は完了に30秒かかります。私は合計時間を10秒未満にしようとしています。

機能で費やされた時間の半分がDRF要求によって占められます。 forループをマルチプロセッシングプールに置き換えるのは理にかなっていますか?もしそうなら、各プロセスが要求パッケージを使用して別々の接続を介して要求を行うようにするにはどうすればよいですか?

私はちょうど交換してみました:

for scenario_id in scenario_ids: 
    step_scenario_partial(scenario_id) 

をして:

によるOpenSSL.SSL.Errorに失敗した
pool = Pool(processes=2) 
pool.map(step_scenario_partial, scenario_ids) 

:[( 'SSLルーチン'、 'ssl3_get_record'、「復号化が失敗しましたか

thisによると、エラーは複数のプロセスで同じSSL接続を再使用したためです。

答えて

1

並列タスクを実行できるconcurrentのPythonモジュール(docs)を使用できます。応答オブジェクトのリストを返す方法例:

from concurrent import futures 

def execute_all(scenario_ids, num_workers=5): 
    ''' 
    Method to make parallel API calls 
    ''' 
    with futures.ThreadPoolExecutor(max_workers=num_workers) as executor: 
     return [result for result in executor.map(step_scenario_partial, scenario_ids)] 

ThreadPoolExecutor非同期並列呼び出しを実行するスレッドのプールを使用します。合計実行時間が< 10秒になるように、num_workersの値を5から試してみることができます。

+0

スレッドは同時に実行されないため、同じSSL接続を再利用することによるエラーを回避できますか? – softweave

+1

あなたの提案を試しました。累積時間はエラーなく8.3秒に短縮されました。 – softweave

関連する問題