2014-07-08 5 views
0

원격 서버의 파일을 로컬 드라이브에 복사하는 python 스크립트를 만들려고합니다. 문제는 다른 파일을 병렬로 복사하기위한 스레드를 생성하지 않는다는 것입니다.파이썬 스레딩과 shutil이 손 잡고 작동하지 않습니까?

import shutil 
import threading 

LocalPath = "C:\\folder1" 
RemotePath = "X:\\folder1" 

# downloader/copier 
def monitorCopy (Filename) : 
    print("Copying of "+Filename+" started.") 
    shutil.copy(RemotePath+"\\"+Filename+"\\"+Filename+".zip",LocalPath) 
    print("Copying of "+Filename+" finished.") 

# main function 
if __name__ == "__main__" : 
    filelist = ["file1","file2","file3"] 
    print(range(len(filelist))) 
    p = [] 
    for i in range(len(filelist)) : 
     p.append(i) 
     p[i] = threading.Thread(target=monitorCopy,args=(filelist[i],)) 
     p[i].daemon = True 
     p[i].start() 
     p[i].join() 

폴더 트리는 다음과 같습니다

Remote Repository 
    [+] --- Filename 
       [+] --- Filename.zip 

Local Repository 
    [+] --- Filename.zip 

사람이 나를 도와주세요 수 있습니까?

답변

1

각 스레드 개체를 작성한 직후에 join을 호출하면 한 번에 둘 이상의 스레드가 실행되지 않습니다. thread_object.join() 호출은 thread_object이 실행을 완료 할 때까지 차단하도록 Python에 지시합니다.이 경우 사용자가 filelist의 항목에 대해 하나의 스레드를 시작하고 스레드가 완료 될 때까지 블로킹 한 다음 filelist의 다음 항목으로 이동하고 동일한 작업을 수행합니다 . 정말로 당신이하고 싶은 것은 병렬로 모든 스레드를 생성하는 것입니다. 모두 만들어지면 join이됩니다.

if __name__ == "__main__" : 
    filelist = ["file1","file2","file3"] 
    print(range(len(filelist))) 
    p = [] 
    for f in filelist: 
     t = threading.Thread(target=monitorCopy,args=(f,)) 
     p.append(t) 
     t.daemon = True 
     t.start() 

    for t in p: 
     t.join() 
+0

볼 수 있습니다. 그것은 작동합니다. 스레드의 작업이 끝나면 자동으로 목록에서 빠져 나올 수 있습니까? – user3814548

+0

@ user3814548 아니요, 완료된'Thread' 개체는 목록에 남아 있습니다. – dano

+0

흠. 이 작업을 수행하는 방법에 대한 제안이 있습니까? 나는 "t"를 글로벌하게 만들고 "f"를 monitorCopy에 전달하고 t [f] .stop()을 추가 할 것을 생각하고 있습니다. – user3814548