Я разработчик бота для Discord и недавно выполнил заказ. У клиента при настройке приложения на своем сервере изначально не было проблем, но, по их словам, после работы в течение «около трех часов» программа начинает выдавать определенную ошибку трассировки стека и больше не принимает команды.
Бот создан с использованием Discord.py и использует Peewee в качестве ORM, используя PyMySQL в качестве драйвера базы данных. Сервер, на котором работает клиент, размещается в DigitalOcean, и если требуется какая-либо информация об оборудовании и т. д., клиент может предоставить мне эту информацию по запросу. Мы уже пытались удалить и переустановить все зависимости, а также попробовать разные их дистрибутивы, но ошибки сохраняются.
Это точная трассировка, которую получает клиент:
File "/usr/local/lib/python3.6/dist-packages/peewee.py", line 2666, in __exit__
reraise(new_type, new_type(*exc_args), traceback)
File "/usr/local/lib/python3.6/dist-packages/peewee.py", line 179, in reraise
raise value.with_traceback(tb)
File "/usr/local/lib/python3.6/dist-packages/peewee.py", line 2875, in execute_sql
cursor.execute(sql, params or ())
File "/usr/local/lib/python3.6/dist-packages/pymysql/cursors.py", line 170, in execute
result = self._query(query)
File "/usr/local/lib/python3.6/dist-packages/pymysql/cursors.py", line 328, in _query
conn.query(q)
File "/usr/local/lib/python3.6/dist-packages/pymysql/connections.py", line 516, in query
self._execute_command(COMMAND.COM_QUERY, sql)
File "/usr/local/lib/python3.6/dist-packages/pymysql/connections.py", line 750, in _execute_command
raise err.InterfaceError("(0, '')")
peewee.InterfaceError: (0, '')
Соответствующие части из моего файла database.py, где открыто соединение с базой данных:
import discord
from peewee import *
from config import db_host, db_port, mysql_db_name, \
mysql_db_username, mysql_db_password
db_connection = MySQLDatabase(
mysql_db_name,
user = mysql_db_username,
password = mysql_db_password,
host = db_host,
port = db_port
)
def create_db_tables():
# create_tables() does safe creation by default, and will simply not create
# table if it already exists
db_connection.create_tables([User])
Соответствующие части моего файла bot.py, в частности функция запуска бота, которая запускается при первом открытии бота, и строки, которые создают и запускают клиент бота:
client = discord.Client()
async def bot_startup():
# Check for config changes
if client.user.name != config.bot_username:
print("Username Updated To: {}".format(config.bot_username))
await client.edit_profile(username=config.bot_username)
# Start 'playing' message
await client.change_presence(
game=discord.Game( name=config.playing_message )
)
# Prepare database
database.create_db_tables()
print("Database Connected")
print("Connected Successfully")
# ...
@client.event
async def on_ready():
await bot_startup()
# ...
client.run(config.token)
По словам клиента, перезапуск бота временно решает проблему, и он работает нормально в течение нескольких часов, прежде чем ошибки снова начнутся. Бот больше не отвечает на любые входящие команды после начала ошибок, а если выдается достаточное количество ошибок, полностью падает.
Что обычно является причиной этой ошибки и какие шаги следует предпринять, чтобы исправить ее причину?