Никита Обухов, если возникли проблемы с производительностью, то имеет смысл запустить какой-нибудь профилировщик и проанализировать результаты его работы. Для профилирования многопоточного/асинхронного кода можете попробовать, например, Yappi.
Что касается Вашего кода, то после беглого просмотра репозитория хотел бы отметить следующее:
1. Зачем в репозиторий добавлен файл .cache? Судя по его содержимому это некий токен доступа:
Поэтому компрометации учетной записи не произошло, тем не менее, никаким токенам доступа, логинам, паролям и иной подобной информации не место в публичном репозитории. Следите за этим!
2. Зачем в репозиторий добавлены папки __pycache__ и cogs/__pycache__? Им там тоже не место.
Добавьте в корневую папку файл .gitignore, например такой. При необходимости его следует отредактировать, чтобы он соответствовал проекту.
3. Что касается
не переборщил ли я с асинхронниками, и блокировками.
то обратите внимание на следующий код в файле bot_handler.py:
# ... skip ....
async def load_cog():
for file in os.listdir("./cogs"):
if file.endswith(".py"):
bot.load_extension(f"cogs.{file[:-3]}")
log_message(f"The cog {file[:-3]} has been loaded.")
# ... skip ...
if __name__ == '__main__':
bot.loop.run_until_complete(load_cog())
# ... skip ...
Функция load_cog не содержит вызовов каких-либо корутин, т.е. инструкций вида await some_coroutine(), поэтому нет никого смысла запускать её с использованием event loop. Убирайте ключевое слово async и используйте её как обычную синхронную функцию. Кроме того, аналогичная функция есть в библиотеке disnake. Можете использовать её.
Я уверен, что существует масса и других способов улучшить Вашу программу, но у меня, к сожалению, нет возможности детально разбираться с кодом и давать рекомендации.
Никита Обухов, ну вот, уже лучше. Исчезла ошибка AttributeError: ... has no attribute 'call_soon_threadsafe', вызванная тем, что в функцию asyncio.run_coroutine_threadsafe(coro, loop) передавалась не ссылка на event loop, а функция, которая его возвращает.
Новая ошибка RuntimeError: There is no current event loop in thread 'Thread-3' вызвана тем, что сам плейер запускается в отдельном потоке, где нет своего event loop'а.
Нужно найти, где в коде программы имеется ссылка на event loop основного потока (она не обязательно должна называться client.loop) или получить такую ссылку с помощью asyncio.get_event_loop() и подумать как её передать в функцию my_after.
По тем отрывкам кода, что были приведены ранее, я это сделать затрудняюсь.
Никита Обухов, попробуйте, для начала, получить event loop с помощью функции asyncio.get_event_loop() и вызвать с его использованием функцию asyncio.run_coroutine_threadsafe(coro, loop) в примере выше.
Т.е. в функции my_after нужно изменить последнюю строку следующим образом:
disnake.ext.tasks.loop тоже не является ссылкой на event loop, поэтому и возникает ошибка: AttributeError: 'function' object has no attribute 'call_soon_threadsafe'.
Что касается Вашего кода, то после беглого просмотра репозитория хотел бы отметить следующее:
1. Зачем в репозиторий добавлен файл .cache? Судя по его содержимому это некий токен доступа:
Справедливости ради нужно отметить, что срок его действия истек примерно за 3 дня до того как он был опубликован 23.07.2023:
Поэтому компрометации учетной записи не произошло, тем не менее, никаким токенам доступа, логинам, паролям и иной подобной информации не место в публичном репозитории. Следите за этим!
2. Зачем в репозиторий добавлены папки __pycache__ и cogs/__pycache__? Им там тоже не место.
Добавьте в корневую папку файл .gitignore, например такой. При необходимости его следует отредактировать, чтобы он соответствовал проекту.
3. Что касается
то обратите внимание на следующий код в файле bot_handler.py:
Функция load_cog не содержит вызовов каких-либо корутин, т.е. инструкций вида await some_coroutine(), поэтому нет никого смысла запускать её с использованием event loop. Убирайте ключевое слово async и используйте её как обычную синхронную функцию. Кроме того, аналогичная функция есть в библиотеке disnake. Можете использовать её.
Я уверен, что существует масса и других способов улучшить Вашу программу, но у меня, к сожалению, нет возможности детально разбираться с кодом и давать рекомендации.