Я использую gevent-socketio v0.13.8 для приложения чата в веб-приложении на основе django. Моя база данных - MySql и имеет значение max_user_connection = 1500. Мой сервер сокетов демонанизирован демоном python. Я использовал сервер сокетов без патчей обезьян, и он работал хорошо, за исключением случаев, когда на гриле произошла ошибка, вся система выходит из строя с помощью SystemExit, и соединение больше не может быть установлено. Решением было перезагрузить весь сервер.max_user_connections после gevent.monkey.patch_all()
Однако я не хочу перезапускать сервер каждый раз. И, наконец, я придумал идею обезглавливания обезьян. Я не знаю, относится ли это к моей проблеме, но я хочу, чтобы мой сервер сокетов запускался, даже если необработанное исключение вызывает SystemExit на гриле.
Затем я использовал gevent.monkey.patch_all() в моей функции запуска сервера. А вот моя главная проблема сейчас: После 3-4 соединений, MySql вызывает следующее сообщение об ошибке:
User xxx already has more than 'max_user_connections' active connections
переменной max_user_connection установлена в 1500 в сервере MySQL. Я думаю, что что-то создает новое соединение с базой данных в зеленых.
По ошибке max_user_connection пути не появляется, когда я использую:
monkey.patch_all(socket=True, dns=True, time=True, select=True, thread=True, os=True, ssl=True, httplib=True, aggressive=True)
вместо:
monkey.patch_all()
Есть ли способ использовать обезьяну заплаток, не получая эту ошибку? Если я забыл дать какую-либо информацию об определении проблемы, пожалуйста, дайте мне знать, и я буду обновлять сразу
А вот мой daemonized код сервера:
class App():
def __init__(self):
self.stdin_path = 'xxx.txt'
self.stdout_path = 'xxx.txt'
self.stderr_path = 'xxx.txt'
self.pidfile_path = 'xxx.pid'
self.pidfile_timeout = 5
def run(self):
from socketio.server import SocketIOServer
from gevent import monkey
monkey.patch_all()
while True:
try:
bind = ("xx.xx.xx.xx", xxxx)
handler = get_handler()
server = SocketIOServer(bind, handler, resource="socket.io",policy_server=False)
server.serve_forever()
except:
server.kill()
app = App()
logger = logging.getLogger("DaemonLog")
logger.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler = logging.FileHandler("xxx.log")
handler.setFormatter(formatter)
logger.addHandler(handler)
daemon_runner = runner.DaemonRunner(app)
daemon_runner.daemon_context.files_preserve=[handler.stream]
daemon_runner.do_action()