优化循环发出 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 秒。