В настоящее время у меня есть эта функция, которая выполняет вызов API, каждый вызов API запрашивает разные данные. Я могу делать до 300 одновременных вызовов API одновременно.
Делать это, похоже, не быстро, так как это просто ожидание реплики. Мне было интересно, как мне сделать эту функцию быстрее?
from multiprocessing.pool import ThreadPool
import requests
pool = ThreadPool(processes=500)
variables = VariableBaseDict
for item in variables:
async_result = pool.apply_async(requests.get(url.json()))
result = async_result.get()
#do stuff with result
Ваш текущий код на самом деле не обрабатывает какую-либо реальную работу в рабочем потоке. Вы вызываете requests.get(url.json())
прямо в основном потоке, а затем передаете объект, который возвращается в pool.apply_async
. Вместо этого вы должны делать pool.apply_async(requests.get, (url.json(),))
. Тем не менее, даже если вы исправили эту проблему, вы сразу же ждете ответа на вызов, что означает, что вы фактически никогда не выполняете никаких вызовов одновременно. Вы передаете один элемент в поток, ждете, пока он будет выполнен, а затем ждете следующего элемента.
Тебе следует:
requests.get(...)
в основной теме.pool.map
, чтобы передать список работы рабочим потокам одновременно, либо продолжайте использовать pool.apply_async
, но вместо немедленного вызова async_result.get()
сохраните все async_result
объекты в списке, и после того, как вы выполните итерацию по variables
, выполните итерацию по async_result
список и вызов .get()
на каждом элементе. Таким образом, вы фактически выполняете все вызовы одновременно.Итак, если бы вы использовали apply_async
, вы бы сделали что-то вроде этого:
async_results = [pool.apply_async(requests.get, (build_url(item),)) for item in variables]
for ar in async_results:
result = ar.get()
# do stuff with result
С pool.map
это будет:
results = pool.map(requests.get, [build_url(item) for item in variables])
@nadermx Это нормально, в этом случае вы просто создаете свой URL-адрес, используя item
(при условии, что это то, что вы создаете на самом деле).
Однако URL-адрес меняется при каждом запросе, например, дополнительные переменные, например «id = 3» против «id = 10».