Gearman + SQLAlchemy - 不断丢失MySQL线程

4 投票
1 回答
1449 浏览
提问于 2025-04-16 11:10

我有一个Python脚本,它设置了几个gearman工作者。这些工作者会调用我在SQLAlchemy模型上定义的一些方法,这些模型也被一个Pylons应用使用。

一切运行得很好,大约过了一个小时或两个小时后,MySQL的线程就会失去连接,所有的查询都会失败。我搞不清楚为什么线程会失去连接(在三台不同的服务器上都出现了同样的问题),而且我设置的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

我发现无论是使用Ruby、PHP还是Python,不管用什么数据库库,都会遇到这个问题。我找不到“正确”的解决办法,也就是用mysql_ping,但这里有一个SQLAlchemy的解决方案,讲得更清楚一些,链接在这里:http://groups.google.com/group/sqlalchemy/browse_thread/thread/9412808e695168ea/c31f5c967c135be0

在那个讨论中,有人提到,把回收选项设置为True和设置为1是一样的。一个更好的解决办法可能是找到你的MySQL连接超时时间,然后把回收阈值设置为它的80%。

你可以通过查看这个变量来获取那个值:http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_connect_timeout

编辑: 我花了一些时间才找到关于使用pool_recycle的权威文档,链接在这里:http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html?highlight=pool_recycle

撰写回答