Вы можете использовать concurrent
библиотеку Python, которая предназначена для обработки очереди запросов среди всех или некоторых потоков, поедая очередь до тех пор, пока все задания не будут полностью выполнены.
- Создайте большой список файлов, например,
[ [f0..f0-1], [fn..f2n-1]..]
- Используйте
ThreadPoolExecutor
этот список со всеми многочисленными нитями вашего компьютера. Это может выглядеть так:
import os import sys from concurrent.futures import ThreadPoolExecutor import subprocess import itertools import math def main(p, num_tar_files): files = list(split_files_in(p, num_tar_files)) tar_up = tar_up_fn(p) with ThreadPoolExecutor(len(files)) as executor: archives = list(executor.map(tar_up, itertools.count(), files)) print("\n {} archives generated".format(len(archives))) def split_files_in(p, num_slices): files = sorted(os.listdir(p)) N = len(files) T = int(math.ceil(N / num_slices)) # means last .tar might contain <T files for i in range(0, N, T): yield files[i:i+T] def tar_up_fn(p): def tar_up(i, files): _, dir_name = os.path.split(p) tar_file_name = "{}_{:05d}.tar".format(dir_name, i) print('Tarring {}'.format(tar_file_name)) subprocess.call(["tar", "-cf", tar_file_name] + files, cwd=p) return tar_file_name return tar_up if __name__ == '__main__': main(sys.argv[1], int(sys.argv[2]))