同时复制一个文件到多个路径
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')
我每天将 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')