使用连接队列时,为什么在多处理期间数据库连接丢失?

时间:2017-10-04 01:07:12

标签: python python-2.7 mysql-python python-multiprocessing

我正在用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失去连接的原因。由于每个进程都有一个单独的测试对象,它有自己的(很大程度上未使用过的)队列,我不认为它会干扰。有人可以对此有所了解吗?

0 个答案:

没有答案