我有一个python脚本,设置了几个gearman worker。他们调用SQLAlchemy模型中的一些方法,我也使用了Pylons应用程序。Gearman + SQLAlchemy - 不断丢失MySQL线程
一切正常工作一两个小时,然后MySQL线程会丢失,所有查询失败。当我为pool_recycle定义这样一个低值时,我无法弄清楚为什么线程正在丢失(我在3台不同的服务器上得到相同的结果)。另外,为什么不创建新的连接?
要调查的事情的任何想法?
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()
另一种思考的authoritivie文档,你释放任务之间的sqlalchemy会话还是重新使用它们? – David 2011-02-03 21:03:07
@大卫 - 不,我没有解放他们,重复使用他们。做了更多挖掘,发现日志中的“无法重新连接,直到无效事务回滚”。所以我在每个作业之后都尝试过一个session.rollback(),但是这与我的一个作业的功能发生冲突,这会缓存sqlalchemy响应对象,并在后续作业中将其重用于大型加速。所以现在我正在尝试使用NullPool - engine = create_engine(sqlachemy_url,poolclass = NullPool),并在每个作业之后调用session.close()。 24小时后将知道这是否是胜利组合。 – Tony 2011-02-04 16:45:19