同时将文件复制到多个路径

时间:2016-09-21 17:43:05

标签: python python-3.x shutil

我每天将150-200mb的文件传输到许多位置(位于世界各地的共享驱动器)。问题是每次传输(使用shutil)大约需要100-700秒,每个传输都必须完成才能开始下一个传输。如果我这样做,现在转移一些文件需要一整个小时。我的临时解决方案是为每个位置创建一个单独的.py文件,以便它们可以同时完成,但这并不理想。

如何进入多线程编程?我想立刻运行所有转移,但我对此没有经验。

一个简单的谷歌搜索让我找到了:

https://docs.python.org/3/library/concurrent.futures.html

import shutil
with ThreadPoolExecutor(max_workers=4) as e:
    e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
    e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
    e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
    e.submit(shutil.copy, 'src4.txt', 'dest4.txt')

有人能指出我正确的方向吗?我一直想要学习如何在一段时间内并行做事,但从未接触过它。

1 个答案:

答案 0 :(得分:1)

这是一个可以满足您需求的工作示例。请注意,如果瓶颈是网络带宽,它可能不会比一次一个快。

from concurrent.futures import ThreadPoolExecutor
import os
import shutil
import time
from threading import Lock

src_dir = './test_src'
src_files = 'src1.txt', 'src2.txt', 'src3.txt', 'src4.txt'
dst_dir = './test_dst'
print_lock = Lock()

_print = print  # save original
def print(*args, **kwargs):
    """Prevents concurrent printing."""
    with print_lock:
        _print(*args, **kwargs)

def copy_file(src_file):
    src_file = os.path.join(src_dir, src_file)
    print('starting transfer of "{}"'.format(src_file))
    shutil.copy2(src_file, dst_dir)
    print('transfer of "{}" completed'.format(src_file))

with ThreadPoolExecutor(max_workers=4) as e:
    jobs = [e.submit(copy_file, src_file) for src_file in src_files]

while any(job.running() for job in jobs):
    time.sleep(.1)
print('done')