首页 > 解决方案 > 如何从 Python 维护到 MySQL 的嵌套并行连接

问题描述

我们有一个小的 python 程序,它从一个不断被填充的目录中对文件进行排序,并相应地将其加载到正确的 MySQL 表中。

有七个表,python 程序为每个表维护 5 个打开的连接(使用名为 DBUtils.PooledDB 的工具)。

我想通过所有 35(7x5) 个连接并行发送文件,但是虽然使用 map 的 python 多处理使我能够在一个级别(一个表的五个连接)这样做,但父进程必须串行运行(通过七张桌子)。

我使用 multiprocessing.Pool.map_async() 启动整个过程,因此所有 35 个连接在开始时都处于活动状态,但随着每个表完成,其余表必须等待整个池完成。

我希望能够分别运行所有 35 个进程,以便它们可以继续相互独立地工作。

from multiprocessing import Pool
import pymysql
from DBUtils.PooledDB import PooledDB

# Pool of 35 connections
g_pool_0 = PooledDB(creator=pymysql, maxconnections=5 host=host, user=user db=db)
...
g_pool_6 = PooledDB(creator=pymysql, maxconnections=5 host=host, user=user db=db)

def insert_to_db(filename):
    # Load filename data into the database according to the filename

if __name__ == "__main__":

    while True:

        files_0 = glob.glob(join(cur_d, 'results/*_0.csv'))
        ...
        files_0 = glob.glob(join(cur_d, 'results/*_6.csv'))

        # start inserting to DB on all 7 databases

        pool_0 = Pool(5)
        pool_0.map_async(insert_to_db, files_0)
        ...
        pool_7 = Pool(5)
        pool_7.map_async(insert_to_db, files_7)

        pool_0.close()
        pool_0.join()
        ...
        pool_7.close()
        pool_7.join()

这可行,但我必须使用 while 循环来继续处理接收恒定文件流的目录。如果 while 循环中有任何活动连接,则其他连接必须等待 while 循环完成。

我不想运行 7 个单独的脚本。无论如何在嵌套线程/进程中执行此操作?

标签: pythonpymysql

解决方案


推荐阅读