Чтобы эффективно отправить 100 тысяч POST-запросов в Python, следует использовать асинхронное программирование. Для этого можно использовать библиотеку `aiohttp`, которая поддерживает асинхронные HTTP-запросы. Также можно использовать `asyncio` для управления корутинами.
Вот пример кода, использующего `aiohttp` для отправки большого количества POST-запросов параллельно:
```python
import asyncio
import aiohttp
# Функция для отправки одного POST-запроса
async def post_request(session, url, data):
async with session.post(url, data=data) as response:
# Не обрабатываем ответ
pass
# Основная функция для отправки запросов
async def main(url, data_list):
async with aiohttp.ClientSession() as session:
tasks = []
for data in data_list:
task = asyncio.ensure_future(post_request(session, url, data))
tasks.append(task)
# Собираем все задачи и ждем их завершения
await asyncio.gather(*tasks)
# Запуск
if __name__ == '__main__':
url = 'http://example.com/post' # Укажите ваш URL
data_list = [{'key': 'value'}] * 100000 # Подготовьте ваши данные
loop = asyncio.get_event_loop()
loop.run_until_complete(main(url, data_list))
```
### Объяснение кода:
1. **`aiohttp.ClientSession`** - используется для создания сессии, которая позволяет делать множество запросов с минимальными накладными расходами.
2. **`async with session.post(...)`** - асинхронный контекстный менеджер для отправки POST-запроса.
3. **`asyncio.ensure_future`** - создает задачу для выполнения корутины в фоновом режиме.
4. **`asyncio.gather(*tasks)`** - ждет, пока все задачии завершат выполнение.
### Рекомендации:
- **Ограничение количества одновременных запросов**: Для улучшения производительности и избежания перегрузки сервера, вы можете использовать семафор для ограничения количества одновременно выполняемых запросов.
- **Добавление задержек**: Если необходимо, добавьте небольшие задержки между запросами с помощью `asyncio.sleep`, чтобы следовать правилам вашего сервера.
Вот пример с использованием семафора:
```python
semaphore = asyncio.Semaphore(100) # Ограничиваем количество параллельных запросов
async def post_request(session, url, data):
async with semaphore:
async with session.post(url, data=data) as response:
pass
```
Это обеспечит устойчивость и поможет избежать блокировки из-за превышения лимитов запросов на сервер.