2016-09-21 2 views
0

150-200MBのファイルを毎日多くの場所(世界中にある共有ドライブ)に転送しています。問題は、各転送(shutilを使用)はおそらく100〜700秒かかることであり、次の転送を開始するためにはそれぞれ完了する必要があるということです。このようにすれば、いくつかのファイルを転送するのに今一時間かかるようになります。私の一時的な解決策は、各場所で同時に実行できるように別々の.pyファイルを作成することでしたが、それは理想的ではありません。ファイルを複数のパスに同時にコピーする

マルチスレッドプログラミングにはどうすればいいですか?一度にすべての転送を実行したいと思いますが、これにはゼロの経験があります。

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

シンプルなGoogle検索をして私を上陸させました。

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

[このポスト](http://stackoverflow.com/questions/20887555/dead-simple-example-of-using-multiprocessing-queue-pool-and-locking)はあなたを助けるでしょう。私は、受け入れられた答えが役に立つ例であることを発見しました。 – PyNoob

+0

ファイルの名前を変更することもできます。それは正しいですか? – martineau

+0

そのコードスニペットは、私がリンクしているドキュメントのものです(私がctrl + Fをシャットルに使用したとき)。私は名前を変更することはありません。 shutil.copy2( '../ dashboard.twbx'、 '//共有パス/地域/ダッシュボード/') – trench

答えて

1

ここでは、必要なものを実行する実例があります。ボトルネックがネットワーク帯域幅の場合は、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') 
+0

こんにちは、ありがとう。私はこれを試して、最初のファイルをコピーしましたが、2番目のファイルはコピーしませんでした。コードはまだ実行されていて、印刷は「ファイル名の転送を開始しました」と表示されていましたが、1つだけが完了してから「完了」と表示されました。また、1つのファイルを複数の目的地に共有することに焦点を当てるためにこれを微調整することは可能ですか? – trench

+0

ええ、ローカルに私のために働いています(私のLAN上の場所には/からではありませんが、それは問題ではありません)。 'done'を出力した場合、すべての' shutil.copy2() '呼び出しは何のエラーも発生せずに返されます。おそらく 'copy2'はマルチスレッドをサポートしていません(しかし、私のテストファイルが非常に小さいため、これを使用してしまいました)。同じファイルを複数の場所にコピーするには、 'dst_dir'引数を受け入れるように' copy_file() 'を変更し、それを複数回、それぞれの宛先ごとに1回呼び出します。 – martineau

+0

ありがとう。 – trench

関連する問題