2014-05-26 2 views
0

Я использую 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() 

ответ

0

Я нашел решение моей проблемы на: https://github.com/abourget/gevent-socketio/issues/174

Фактически это связано с не закрытыми соединениями с базой данных зеленых. После добавления аналогичного исключения_handler_decorator в мой класс пространства имен я не вижу ошибок max_user_connection

from django.db import close_old_connections # Django 1.6 
class MyNamespace(BaseNamespace): 
    ... 
    def exception_handler_decorator(self, fun): 
     def wrap(*args, **kwargs): 
      try: 
       return fun(*args, **kwargs) 
      finally: 
       close_old_connections() 
     return wrap 
    ... 
Смежные вопросы