@ProgrammDevel

Как создать многопоточную программу обращающиеся к API?

Есть API с ограничениями на запросов в секунду.

Нужно многопоточно обращаться к API и получать нужные значения

Но есть проблема с ограничениями на запросы в секунду от одного ip

Как сделать, чтобы можно было обращаться многопоточно к API?
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
@historydev
Острая аллергия на анимешников
Прокси
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Everything_is_bad
вариантов куча, например, сделать все запросы через очередь с одним исполнителем, который будет делать нужные задержки
Ответ написан
NikFaraday
@NikFaraday
Student full-stack Developer
обращаться многопоточно к API


Многопоточно? Как, блин, потоки с IP связанны? Ну закиньте что-то типа такого:

while(true)
{
    requestTo('https://domail.com') // Async operation without await
}


UPD:

Если стоит ограничение, тогда лучше так:

while(true)
{
speep(100); // API waiting
await requestTo('https://domail.com');
}
Ответ написан
Vindicar
@Vindicar
RTFM!
Причём тут конкретно многопоточность?
Если дело в том, что в нескольких потоках трудно координировать обращения к API, то как выше правильно сказали - делайте очередь запросов (например, queue.SimpleQueue) и отдельный поток, который будет эти запросы выполнять с учётом лимитов.

Например, так: поток-клиент кладёт в очередь словарь вида
task = {'ready': threading.Event(), 'params': {...тут параметры запроса...} }
, а потом делает
task['ready'].wait()
if 'error' in task:
    ... # реагируем на ошибку
else:
    ...  # читаем результат из task['result']

Тогда рабочий поток, реализующий обращения, будет принимать очередное задание из очереди, делать запрос к API согласно содержимому params, потом записывать результат в task['result'] или ошибку в task['error'] и делать task['ready'].set(), чтобы уведомить клиента о том, что его задание завершено.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы