Discord.py бот обрабатывает только одно событие за раз?

#discord #discord.py

#Discord #discord.py

Вопрос:

Я создал базового бота для очистки Интернета (в частности, того, который отправлялся в goodreads и очищал информацию о запрошенной книге). Поскольку он должен выполнять небольшую очистку (и, возможно, потому, что я размещаю его на своем ноутбуке), для каждого запроса требуется около 10 секунд.

Я заметил, что если я ввел два запроса сразу друг за другом, он выполнил второй только после завершения первого. Как бы мне заставить его запускать их параллельно? Я читал что-то о сегментах, но, похоже, это для нескольких серверов (и это тоже только на 100 серверах или около того). Прямо сейчас это только на одном сервере (мой тестовый сервер).

Обновление: Согласно ответу, я могу использовать aiohttp вместо запросов, чтобы делать то, что я хочу делать. Я мог бы воспользоваться некоторой помощью относительно эквивалента aiohttp этого кода:

 sess = requests.session()
req = sess.get(i) #i is a url
soup = BeautifulSoup(req.content, 'html.parser')
link = soup.find('a')['href']
print(link)
with sess.get(link, stream=True) as req2:
    with open(os.path.join('C:\save\location', f"{file}.txt"), "wb") as x_file:
        shutil.copyfileobj(req2.raw, x_file)
  

Где file — переменная, инициализированная ранее. По сути, здесь происходит то, что я записываю содержимое загружаемого файла в текстовый файл в нужном каталоге.

Комментарии:

1. Не могли бы вы отредактировать свой вопрос, чтобы включить код, который у вас есть на данный момент?

Ответ №1:

Проблема в том, что вы используете requests , использование requests в асинхронной функции приводит к блокировке всего кода, что приводит к использованию другой команды только после завершения 1-й. Предпочитаете использовать aiohttp вместо requests , поскольку он обеспечивает асинхронную поддержку HTTP-запросов.

Подробнее об этом читайте What blocking means? здесь

Пример:

 import aiohttp

URL = "https://www.reddit.com/r/aww/hot.json?limit=10"

async with aiohttp.request("GET", URL) as response:
    # Check if the request was vaild.
    if response.status == 200:
        # Converts response into dict.
        json_data = await response.json()

        # Gives you plain text.
        text_data = await response.text()

    else:
        print(f"The request was not successfulnStatus code: {response.status}")
  

Комментарии:

1. О, я понимаю. Я прочитаю об этом, внедрю его и свяжусь с вами!

2.Привет! Я посмотрел aiohttp, но не смог его полностью получить. Не могли бы вы, возможно, объяснить, каким будет эквивалентный фрагмент кода при использовании aiohttp? r = requests.get(link) page=r.text

3. Привет, извините, что снова беспокою вас. Я обновил вопрос конкретным фрагментом кода, с которым мне нужна помощь.

4. P.S: Кстати, все остальное работает отлично, спасибо!

5. рад это слышать!