Python: сделать 6000 вызовов API - PullRequest
0 голосов
/ 04 апреля 2020

Я пишу сценарий python, чтобы сделать вызовы API 6000, и это занимает около 20 минут в синхронном формате. Я пытаюсь выяснить, могу ли я уменьшить время процесса до менее минуты.

Ниже приведены шаги, которые я предпринимаю

  1. Чтение файла CSV, в котором есть SKU (уникальный продукт идентификатор)
  2. Внутри функции, которую я использую для l oop для создания URL с SKU в конце
  3. Возьмите объект ответа и передайте другой функции (объект ответа имеет имя продукта и цену )

Как я уже говорил, в синхронном формате это занимает около 20 минут или больше, и я пытался использовать потоки, время процесса сократилось до 5 минут, но проблема с потоками - функция не возвращает ничего. Поэтому для преодоления проблемы с потоками я использовал модуль очереди, но затем время процесса увеличилось.

Я новичок в python, поэтому не уверен, что я могу сделать, чтобы сократить время процесса, я посмотрел в asyncio, но это очень запутанно и Я даже не уверен, с чего начать с asyncio.


Поэтому я добавил приведенный ниже код, не уверен, что это лучший способ справиться с этим. Это возвращает ответ через 127 секунд для 2750 вызовов API.

Я добавил 10 функций и использую 10 потоков для их вызова.

with concurrent.futures.ThreadPoolExecutor() as executor:
first = executor.submit(get_stock_info_first)
second = executor.submit(get_stock_info_second)
third = executor.submit(get_stock_info_third)
fourth = executor.submit(get_stock_info_fourth)
fifth = executor.submit(get_stock_info_fifth)
sixth = executor.submit(get_stock_info_sixth)
seventh = executor.submit(get_stock_info_seventh)
eight = executor.submit(get_stock_info_eight)
t9 = executor.submit(get_stock_info_t9)
t10 = executor.submit(get_stock_info_t10)

return_value1 = first.result()
return_value2 = second.result()
return_value3 = third.result()
return_value4 = fourth.result()
return_value5 = fifth.result()
return_value6 = sixth.result()
return_value7 = seventh.result()
return_value8 = eight.result()
return_value9 = t9.result()
return_value10 = t10.result()

Я пытаюсь понять, как я могу улучшить это код. Пожалуйста, дайте мне знать, если есть лучший способ сделать это.

1 Ответ

0 голосов
/ 04 апреля 2020

Возможно, вы можете попытаться использовать профилировщик, чтобы выяснить, где в коде ваша программа тратит больше всего времени / процессорных циклов, и вы также можете профилировать память, если это важно.

python В документах есть некоторые рекомендации для профилировщиков (https://docs.python.org/2/library/profile.html), и я знаю, что есть и более визуальные с хорошими GUI.

...