Python - 多进程池中的 make_archive zip 无法正常工作

Posted

技术标签:

【中文标题】Python - 多进程池中的 make_archive zip 无法正常工作【英文标题】:Python - make_archive zip in multiprocess pool not working properly 【发布时间】:2020-05-07 15:18:48 【问题描述】:

我想同时从多个进程创建一个 zip 存档。 当我从多处理中使用池时。 一些 zip 存档尚未创建。 似乎关闭方法不等待进程结束 在进程启动器下方:

import os
import sys
import json
from multiprocessing import Pool
from shutil import copyfile, make_archive
from xml.etree.ElementTree import ElementTree

def launch_traitment(path, path_upload):
    print(path)
    with Pool(processes=NB_PROCESS) as pool:
        for dir in os.listdir(path):
            pool.apply_async(compute_dir,(dir,path,path_upload,))
        pool.close()
        pool.join()
...
def compute_dir(dir, path, path_upload):

    working_path = path+'/'+dir
    deleteAck(working_path+'/'+dir+'.ack')
    execute(dir, path)
    generateZIP(dir, working_path, path_upload)
...
def generateZIP(dir, working_path, path_upload):
    lst_file_meta_data = dir.split('_')
    if len(lst_file_meta_data) < 3:
        print(f"File dir incorrect naming")
        return 1

    provider = lst_file_meta_data[0]
    registration = lst_file_meta_data[1]
    session_date = lst_file_meta_data[2]

    zip_file = path_upload+'/'+provider+'/'+registration

    if not os.path.exists(zip_file+'/'+ dir +'.zip'):
        print('Génération du ZIP : ', zip_file+'/'+ dir +'.zip')
        if not os.path.exists(zip_file):
            os.makedirs(zip_file)
        make_archive(zip_file+'/'+ dir, 'zip', working_path)


我尝试使用系统命令创建 zip,但我遇到了同样的问题:

os.system(f'zip -r -j zip_file/dir.zip working_path')

我也试过了,但是没有抛出异常

【问题讨论】:

也许您需要将 pool.join() 放在 pool.close() 之前?尝试在每个 zip 作业的开头打印“开始”,并在结尾打印“结束”。然后比较'begin'和'end'的计数。 我之前已经尝试过加入,但它会引发错误。文档说您应该在调用 join 之前关闭或终止。 make_archive 的代码在哪里? 我已经编辑了我之前的帖子,这是一个导入。 尝试在pool.close() 之前添加pool.wait()。您的代码还需要from multiprocessing.pool import ThreadPool 或类似的。 【参考方案1】:

我找到了答案。我的进程数低于我的 for 循环启动的进程数。所以如果这个过程还没有完成他的处理,它就会被一个新的覆盖。

【讨论】:

以上是关于Python - 多进程池中的 make_archive zip 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

多进程池中的 apply_async 问题

shutil.make_archive 线程安全吗?

python 归纳 (十五)_多进程使用Pool

Python多进程,多线程和异步实例

Python多进程,多线程和异步实例

Python 多进程池