Gearman + SQLAlchemy - продолжайте терять поток MySQL - PullRequest
4 голосов
/ 03 февраля 2011

У меня есть скрипт на python, который настраивает нескольких рабочих. Они вызывают некоторые методы в моих моделях SQLAlchemy, которые также используются приложением Pylons.

Все работает отлично в течение часа или двух, затем поток MySQL теряется и все запросы не выполняются. Я не могу понять, почему поток теряется (я получаю одинаковые результаты на 3 разных серверах), когда определяю такое низкое значение для pool_recycle. Кроме того, почему бы не создать новое соединение?

Есть идеи, что исследовать?

import gearman
import json
import ConfigParser
import sys
from sqlalchemy import create_engine

class JSONDataEncoder(gearman.DataEncoder):
    @classmethod
    def encode(cls, encodable_object):
        return json.dumps(encodable_object)
    @classmethod
    def decode(cls, decodable_string):
        return json.loads(decodable_string)

# get the ini path and load the gearman server ips:ports
try:
    ini_file = sys.argv[1]
    lib_path = sys.argv[2]
except Exception:
    raise Exception("ini file path or anypy lib path not set")

# get the config
config = ConfigParser.ConfigParser()
config.read(ini_file)
sqlachemy_url =  config.get('app:main', 'sqlalchemy.url')
gearman_servers =  config.get('app:main', 'gearman.mysql_servers').split(",")

# add anypy include path
sys.path.append(lib_path)
from mypylonsapp.model.user import User, init_model
from mypylonsapp.model.gearman import task_rates

# sqlalchemy setup, recycle connection every hour
engine = create_engine(sqlachemy_url, pool_recycle=3600)
init_model(engine)

# Gearman Worker Setup
gm_worker = gearman.GearmanWorker(gearman_servers)
gm_worker.data_encoder = JSONDataEncoder()

# register the workers
gm_worker.register_task('login', User.login_gearman_worker)
gm_worker.register_task('rates', task_rates)

# work
gm_worker.work()

1 Ответ

3 голосов
/ 03 февраля 2011

Я видел это по всем направлениям для Ruby, PHP и Python независимо от используемой библиотеки БД.Я не мог найти, как исправить это «правильным» способом, который заключается в использовании mysql_ping, но есть решение SQLAlchemy, как лучше объяснено здесь http://groups.google.com/group/sqlalchemy/browse_thread/thread/9412808e695168ea/c31f5c967c135be0

Как указывает кто-то в этом потоке, настройка recycleпараметр равно True эквивалентно установке его в 1. Лучшим решением может быть нахождение значения тайм-аута подключения MySQL и установка порога повторного использования равным 80%.

Вы можете получить это значение из живого наборапросматривая эту переменную http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_connect_timeout

Редактировать: Мне потребовалось немного, чтобы найти authoritivie документацию по использованию pool_recycle http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html?highlight=pool_recycle

...