我每天将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')
有人能指出我正确的方向吗?我一直想要学习如何在一段时间内并行做事,但从未接触过它。
答案 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')