@kazmiruk

Почем через некоторое время сервер на gevent валится с ошибками?

Есть сервер, написанный на python + gevent. Работа с базой данных ведется через github.com/esnme/ultramysql
Вроде все работает отлично, но через часа 4 (когда как) сервер падает с ошибками:

Traceback (most recent call last):
  File "build/bdist.freebsd-8.1-RELEASE-amd64/egg/gevent/greenlet.py", line 328, in run
    result = self._run(*self.args, **self.kwargs)
  File "/usr/home/admin/server/server/connect.py", line 58, in listener
    self.dispatch(data)
  File "/usr/home/admin/server/server/connect.py", line 108, in dispatch
    self.auth(data['params'])
  File "/usr/home/admin/server/server/connect.py", line 156, in auth
    result = self.server.db.query("SELECT id, nickname FROM user WHERE id = %s", (self.userId, ))
  File "build/bdist.freebsd-8.1-RELEASE-amd64/egg/gevent/socket.py", line 435, in send
    return sock.send(data, flags)
error: [Errno 32] Broken pipe
<Greenlet at 0x802ae5c30: <bound method Connect.listener of <server.connect.Connect object at 0x8028ef490>>> failed with error


Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\gevent\greenlet.py", line 390, in run
    result = self._run(*self.args, **self.kwargs)
  File "D:\seabattle\server\server\connect.py", line 58, in listener
    self.dispatch(data)
  File "D:\seabattle\server\server\connect.py", line 108, in dispatch
    self.auth(data['params'])
  File "D:\seabattle\server\server\connect.py", line 156, in auth
    result = self.server.db.query("SELECT id, nickname FROM user WHERE id = %s", (self.userId, ))
Error: (0, 'Concurrent access in query method')
<Greenlet at 0x2c6c768L: <bound method Connect.listener of <server.connect.Connect object at 0x0000000002C81198>>> failed with Error


Грешу на драйвер работы с mysql, но причину понять не могу. Вроде рвется коннект, но почему? Наведите на здравую мысль, если не сложно? Или посоветуйте драйвер для работы mysql с gevent.
  • Вопрос задан
  • 3137 просмотров
Пригласить эксперта
Ответы на вопрос 1
@mayorovp
Все же написано: "Concurrent access in query method"
Нельзя вызывать query, пока не выполнился предыдущий.

Вообще, соединение с БД лучше не держать глобальным, а брать из пула на время выполнения операции. Тогда проблем будет меньше.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы