Для написания программы, которая использует несколько потоков для взаимодействия с API, нужно использовать многопоточность, например, с помощью библиотеки threading в Python. Вот пример простой программы, которая отправляет запросы к API из нескольких потоков:
```python
import requests
import threading
# Функция для отправки запроса к API
def send_request(url):
response = requests.get(url)
print(response.json())
# Список URL-адресов для запросов
urls = ['https://api.example.com/1', 'https://api.example.com/2', 'https://api.example.com/3']
# Создание и запуск потоков для отправки запросов
threads = []
for url in urls:
thread = threading.Thread(target=send_request, args=(url,))
thread.start()
threads.append(thread)
# Ожидание завершения всех потоков
for thread in threads:
thread.join()
```
Чтобы организовать обращение к API с учетом ограничений на частоту запросов с одного IP-адреса, можно использовать тайминги и ограничения на количество одновременных запросов. Например, можно ограничить количество потоков, отправляющих запросы одновременно, и установить задержку между запросами.
```python
import time
import requests
import threading
# Функция для отправки запроса к API с учетом задержки
def send_request(url):
response = requests.get(url)
print(response.json())
time.sleep(1) # 1 секунда задержки между запросами
# Список URL-адресов для запросов
urls = ['https://api.example.com/1', 'https://api.example.com/2', 'https://api.example.com/3']
# Создание и запуск потоков для отправки запросов с задержкой
threads = []
for url in urls:
thread = threading.Thread(target=send_request, args=(url,))
thread.start()
threads.append(thread)
time.sleep(1) # 1 секунда задержки перед созданием следующего потока
# Ожидание завершения всех потоков
for thread in threads:
thread.join()
```
Таким образом, можно организовать обращение к API с учетом ограничений на частоту запросов с одного IP-адреса, используя многопоточность и устанавливая задержку между запросами.