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

Copying a file to multiple paths at the same time

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

我怎样才能涉足多线程编程?我想 运行 一次完成所有转账,但我对这方面的经验为零。

一个简单的 google 搜索让我得到:

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')

有人能指出我正确的方向吗?一段时间以来,我一直想学习如何并行处理事情,但一直没有时间去做。

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

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')