在Python中完成多处理后,如何合并多个文件?

2024-06-01 12:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的代码中,多处理过程用于同时生成多个impdp作业(导入),每个作业生成一个具有动态名称的日志文件:

'/DP_IMP_' + DP_PDB_FULL_NAME[i] + '' + DP_WORKLOAD + '' + str(vardate) + '.log'

vardate = datetime.now().strftime("%d-%b-%Y-%I_%M_%S_%p")
tempfiles = []
for i in range((len(DP_PDB_FULL_NAME))):
        for DP_WORKLOAD in DP_WORKLOAD_NAME:
                 tempfiles.append(logdir + '/DP_IMP_' + DP_PDB_FULL_NAME[i] + '_' + DP_WORKLOAD  +  '_' + str(vardate) + '.log')
                 p1 = multiprocessing.Process(target=imp_workload, args=(DP_WORKLOAD, DP_DURATION_SECONDS, vardate, ))
                 p1.start()

我想在所有进程结束后将创建的所有日志文件合并到一个大型主日志文件中。但是,当我尝试在(for I in range((len(DP_PDB_FULL_NAME))循环下使用类似的内容时:

with open('DATAPUMP_IMP_' + str(vardate) + '.log','wb') as wfd:
    for f in tempfiles:
        with open(f,'rb') as fd:
            shutil.copyfileobj(fd, wfd)

然后它尝试在进程结束之前写入文件

这里,DP_PDB_FULL_NAME是多个数据库的列表,因此多个进程在多个数据库中同时生成。当我尝试在循环结束后添加p1.join()时,多个数据库中不会发生多处理

那么,一旦所有单独的进程都完成了,我应该如何创建一个主日志文件呢


Tags: 文件nameinlogfor进程fullpdb
2条回答

因此,我在第一个循环结束后添加了p1.join(),现在它开始工作了

vardate = datetime.now().strftime("%d-%b-%Y-%I_%M_%S_%p")
tempfiles = []
for i in range((len(DP_PDB_FULL_NAME))):
        for DP_WORKLOAD in DP_WORKLOAD_NAME:
                 tempfiles.append(logdir + '/DP_IMP_' + DP_PDB_FULL_NAME[i] + '_' + DP_WORKLOAD  +  '_' + str(vardate) + '.log')
                 p1 = multiprocessing.Process(target=imp_workload, args=(DP_WORKLOAD, DP_DURATION_SECONDS, vardate, ))
                 p1.start()
p1.join()

with open('DATAPUMP_IMP_' + str(vardate) + '.log','wb') as wfd:
    for f in tempfiles:
        with open(f,'rb') as fd:

为了进一步解释这一点,在上述场景中添加连接有三种情况,并且相应地进行多处理

  1. 在最里面的for循环中:

    因此,如果在这里添加了join,那么多处理将根本不起作用,因为它就在proc.start()之后

for i in range((len(DP_PDB_FULL_NAME))):
        for DP_WORKLOAD in DP_WORKLOAD_NAME:
                 tempfiles.append(logdir + '/DP_IMP_' + str(vardate) + '.log')
                 p1 = multiprocessing.Process(target=imp_workload, args=(DP_WORKLOAD, ))
                 p1.start()
                 p1.join()
  1. 外部for循环内部(最内部for循环外部)

    在这里,多处理只适用于内部循环,而不适用于多个数据库

for i in range((len(DP_PDB_FULL_NAME))):
        for DP_WORKLOAD in DP_WORKLOAD_NAME:
                 tempfiles.append(logdir + '/DP_IMP_' + str(vardate) + '.log')
                 p1 = multiprocessing.Process(target=imp_workload, args=(DP_WORKLOAD, ))
                 p1.start()
        p1.join()
  1. 外部for循环的外部

    这是正确的解决方案(如上所述),它位于使用多处理的所有循环之外

您应该创建某种结构,在其中存储所需的变量和进程句柄。在该循环之后使用join阻塞,直到所有子进程都完成,然后使用结果文件

handles = []
for i in range(10):
    p = Process()
    p.start()
    handles.append(p)

for handle in handles:
    handle.join()

相关问题 更多 >