我正在用Python编写一小组测试,必须与MySQL交互,并加快运行时间我使用多处理Pool
来映射CPU内核。
每个测试都实例化一个包含要测试的函数的对象。该对象还负责其数据库连接的初始化和生命周期,并实现了一个对连接进行排队的游标:
class Cursor(object):
_cache = Queue.Queue(maxsize=5)
def __init__(self, cursor_type=mysql.cursors.Cursor, **options):
super(Cursor, self).__init__()
try:
conn = self._cache.get_nowait()
except Queue.Empty:
conn = mysql.connect(**options)
else:
conn.ping(True)
self.conn = conn
self.conn.autocommit(False)
self.cursor_type = cursor_type
@classmethod
def clear_cache(cls):
cls._cache = Queue.Queue(maxsize=5)
def __enter__(self):
self.cursor = self.conn.cursor(self.cursor_type)
return self.cursor
def __exit__(self, extype, exvalue, traceback):
if extype is mysql.MySQLError:
self.cursor.rollback()
self.cursor.close()
self.conn.commit()
try:
self._cache.put_nowait(self.conn)
except Queue.Full:
self.conn.close()
当我的测试在Pool
中进行批处理时,该过程将始终因此异常而失败:
_mysql_exceptions.OperationalError: (2013, 'Lost connection to MySQL server during query')
我最终缩小了对队列的断开连接问题(不是队列大小,但是队列大小为1并没有修复它)。删除Cursor
对象的与排队相关的部分后,多处理现在稳定。
我不明白连接队列导致MySQL失去连接的原因。由于每个进程都有一个单独的测试对象,它有自己的(很大程度上未使用过的)队列,我不认为它会干扰。有人可以对此有所了解吗?