优化循环发出 django-rest-framework 请求
optimize loop making django-rest-framework requests
我有一个遍历数组的 for 循环。对于数组中的每个项目,它调用一个函数来发出 django-rest-framework 请求。每个函数调用都独立于其他函数调用。
如果数组有 25 个项目,当前需要 30 秒才能完成。我正在努力将总时间缩短到不到 10 秒。
DRF 请求占用了该函数一半的时间。用多处理池替换 for 循环是否有意义?如果是这样,我如何确保每个进程使用请求包通过单独的连接发出请求?
我试过只替换:
for scenario_id in scenario_ids:
step_scenario_partial(scenario_id)
与:
pool = Pool(processes=2)
pool.map(step_scenario_partial, scenario_ids)
由于 OpenSSL.SSL.Error 而失败:[('SSL routines', 'ssl3_get_record', 'decryption failed or bad record mac')]
根据 this,错误是由于在多个进程中重复使用相同的 SSL 连接。
您可以使用可以执行并行任务的 concurrent
python 模块 (docs)。 returns 响应对象列表的示例方法:
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
使用线程池来执行异步并行调用。您可以试验 num_workers 的值,从 5 开始,以确保总执行时间小于 10 秒。
我有一个遍历数组的 for 循环。对于数组中的每个项目,它调用一个函数来发出 django-rest-framework 请求。每个函数调用都独立于其他函数调用。
如果数组有 25 个项目,当前需要 30 秒才能完成。我正在努力将总时间缩短到不到 10 秒。
DRF 请求占用了该函数一半的时间。用多处理池替换 for 循环是否有意义?如果是这样,我如何确保每个进程使用请求包通过单独的连接发出请求?
我试过只替换:
for scenario_id in scenario_ids: step_scenario_partial(scenario_id)
与:
pool = Pool(processes=2) pool.map(step_scenario_partial, scenario_ids)
由于 OpenSSL.SSL.Error 而失败:[('SSL routines', 'ssl3_get_record', 'decryption failed or bad record mac')]
根据 this,错误是由于在多个进程中重复使用相同的 SSL 连接。
您可以使用可以执行并行任务的 concurrent
python 模块 (docs)。 returns 响应对象列表的示例方法:
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
使用线程池来执行异步并行调用。您可以试验 num_workers 的值,从 5 开始,以确保总执行时间小于 10 秒。