#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. рад это слышать!