Accessing a MySQL connection pool from Python multiprocessing

前端 未结 3 932
感动是毒
感动是毒 2020-12-05 11:56

I\'m trying to set up a MySQL connection pool and have my worker processes access the already established pool instead of setting up a new connection each time.

I\'m

3条回答
  •  情话喂你
    2020-12-05 12:49

    First, you're creating a different connection pool for each instance of your DB class. The pools having the same name doesn't make them the same pool

    From the documentation:

    It is not an error for multiple pools to have the same name. An application that must distinguish pools by their pool_name property should create each pool with a distinct name.

    Besides that, sharing a database connection (or connection pool) between different processes would be a bad idea (and i highly doubt it would even work correctly), so each process using it's own connections is actually what you should aim for.

    You could just initialize the pool in your init initializer as a global variable and use that instead.
    Very simple example:

    from multiprocessing import Pool
    from mysql.connector.pooling import MySQLConnectionPool
    from mysql.connector import connect
    import os
    
    pool = None
    
    def init():
        global pool
        print("PID %d: initializing pool..." % os.getpid())
        pool = MySQLConnectionPool(...)
    
    def do_work(q):
        con = pool.get_connection()
        print("PID %d: using connection %s" % (os.getpid(), con))
        c = con.cursor()
        c.execute(q)
        res = c.fetchall()
        con.close()
        return res
    
    def main():
        p = Pool(initializer=init)
        for res in p.map(do_work, ['select * from test']*8):
            print(res)
        p.close()
        p.join()
    
    if __name__ == '__main__':
        main()
    

    Or just use a simple connection instead of a connection pool, as only one connection will be active in each process at a time anyway.
    The number of concurrently used connections is implicitly limited by the size of the multiprocessing.Pool.

提交回复
热议问题