@Xian

Почему возникает ошибка aiohttp.client_exceptions.ClientOSError: [Errno 104] Connection reset by peer При работе с api discord?

Я делаю дискорд бота который должен собирать время прибывания в голосовом канале а так же количество написанных сообщений и из этого формировать рейтинг пользователя, а затем запихивать топ самых активный пользователей в картинку и постить это в одном из каналов. Бот собирает рейтинг за неделю и за месяц. У меня есть Функция которая отвечает за расчёт, создание картинки и выкладывание ее в канал и их соответственно две - за месяц и за неделю. Один почти одинаковы отличаются только названия переменных но при этом месячная функция работает отлично а вот недельная возвращает одну и ту же ошибку. При чем очень странно - когда я добавляю дополнительный текст на картинку то возникает эта ошибка а когда убираю эту часть кода она пропадает/
Вот сама функция:
async def week_vipe():
  global week
  while True:
    reyt = {}
    for guild in client.guilds:
      for member in guild.members:
        voice = round(week[member.id]["voice"] / 120)
        reyt[member.id] = week[member.id]["text"] + voice
    sorted_reyt = {k: b for k, b in sorted(reyt.items(), key=lambda element: element[1], reverse=True)}
    my_image = Image.open("maket.png")
    image_editable = ImageDraw.Draw(my_image)
    text = f"недiльний рейтинг"
    image_editable.text((230,131), text, (125, 95, 53), font=myFont)
    my_image.save("result.png")
    for i in range(3):
      keys_list = list(sorted_reyt)
      username = client.get_user(keys_list[i])
      reyting = sorted_reyt[keys_list[i]]
      if i+1 == 1:
        my_image = Image.open("result.png")
        image_editable = ImageDraw.Draw(my_image)
        text = f"{i+1}. {username}"
        image_editable.text((620,211), text, (125, 95, 53), font=myFont)
        my_image.save("result.png")
      if i+1 == 2:
        my_image = Image.open("result.png")
        image_editable = ImageDraw.Draw(my_image)
        text = f"{i+1}. {username}"
        image_editable.text((620,429), text, (125, 95, 53), font=myFont)
        my_image.save("result.png")
      if i+1 == 3:
        my_image = Image.open("result.png")
        image_editable = ImageDraw.Draw(my_image)
        text = f"{i+1}. {username}"
        image_editable.text((620,647), text, (125, 95, 53), font=myFont)
        my_image.save("result.png")
    chat = client.get_channel(1005796493757780019)
    await chat.send(file=discord.File('result.png'))
    for guild in client.guilds:
      for member in guild.members:
        week[member.id] = {"voice": 0, "text": 0}
    await asyncio.sleep(604800)


async def month_vipe():
  global month
  while True:
    reyt = {}
    for guild in client.guilds:
      for member in guild.members:
        voice = round(month[member.id]["voice"] / 120)
        reyt[member.id] = month[member.id]["text"] + voice
    sorted_reyt = {k: b for k, b in sorted(reyt.items(), key=lambda element: element[1], reverse=True)}
    my_image = Image.open("maket.png")
    image_editable = ImageDraw.Draw(my_image)
    text = f"місячний рейтинг"
    image_editable.text((230,131), text, (125, 95, 53), font=myFont)
    my_image.save("result.png")
    for i in range(3):
      keys_list = list(sorted_reyt)
      username = client.get_user(keys_list[i])
      reyting = sorted_reyt[keys_list[i]]
      if i+1 == 1:
        my_image = Image.open("result.png")
        image_editable = ImageDraw.Draw(my_image)
        text = f"{i+1}. {username}"
        image_editable.text((620,211), text, (125, 95, 53), font=myFont)
        my_image.save("result.png")
      if i+1 == 2:
        my_image = Image.open("result.png")
        image_editable = ImageDraw.Draw(my_image)
        text = f"{i+1}. {username}"
        image_editable.text((620,429), text, (125, 95, 53), font=myFont)
        my_image.save("result.png")
      if i+1 == 3:
        my_image = Image.open("result.png")
        image_editable = ImageDraw.Draw(my_image)
        text = f"{i+1}. {username}"
        image_editable.text((620,647), text, (125, 95, 53), font=myFont)
        my_image.save("result.png")
    chat = client.get_channel(1005796493757780019)
    await chat.send(file=discord.File('result.png'))
    for guild in client.guilds:
      for member in guild.members:
        month[member.id] = {"voice": 0, "text": 0}
    await asyncio.sleep(2592000)

А вот участок который я подозреваю проблемный:
my_image = Image.open("maket.png")
image_editable = ImageDraw.Draw(my_image)
text = f"недiльний рейтинг"
image_editable.text((230,131), text, (125, 95, 53), font=myFont)
my_image.save("result.png")

Я читал про эту ошибку и пишут что проблема с сервером или с интернетом но это не так. Я пробовал заливать код на хостинг и запускать на своей машине и все та же ошибка. Спасибо.
Полный трейсбэк:
62f13648ad33a843275367.jpeg
Простите не смог скопировать.
  • Вопрос задан
  • 712 просмотров
Решения вопроса 1
PIL(low) - блокирующая библиотека.

Блокирующий ("привязанный" к CPU) код не должен вызываться напрямую. Например, если функция выполняет интенсивные для CPU вычисления в течении 1 секунды, все одновременные задачи asyncio (Tasks) и операции ввода-вывода будут отложены на 1 секунду.

Можно использовать "исполнитель" (executor) для запуска задачи в отдельном потоке или даже в отдельном процессе для предотвращения блокирования потока ОС вместе с циклом событий. Смотрите документацию метода loop.run_in_executor() для большей информации.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы