2013-12-11 5 views
1

코딩과 파이썬에 익숙하지 않습니다. 나는 네트워크를 통해 파일을 배포 할 코드를 만들려고했다. 문제는 내가 만든 목록을 반복하고 하나씩 배포하는 것이다. 첫 번째 위치에서 파일을 가져온 경우에만 두 번째 파일로 시작됩니다.파이썬을 사용한 비동기 파일 배포

이 내가 쓴 코드입니다 :

from shutil import copytree 

source = r"O:\versions" 

Eilat = r"\\eilat-zrv\c$\version" 
BeerSheba = r"\\beer-sheba-zrv\c$\version" 
Ashdod = r"\\ashdod-zrv\c$\version" 
Rehovot = r"\\rehovot-zrv\c$\version" 
Rishon = r"\\rishon-zrv\c$\version" 
TelAviv = r"\\dizingof-zrv\c$\version" 
Netanya = r"\\netanya-zrv\c$\version" 
RamatIshay = r"\\ramaty-zrv\c$\version" 
Haifa = r"\\haifa-zrv\c$\version" 



DestList = [Eilat, BeerSheba, Ashdod, Rehovot, Rishon, TelAviv, Netanya, RamatIshay, Haifa] 

def Copy_funct(i): 
    for i in DestList: 
     copytree(source, i) 

Copy_funct(DestList) 

가 어떻게 그것을 동시에 배포 할 수는 ??

+0

수정 : "어떻게 파이썬에서 스레드/하위 프로세스를 생성합니까?" 그것은 공정한 해석일까요? – Floris

+0

몇 가지 유용한 통찰력 http://stackoverflow.com/questions/6286235/multiple-threads-in-python – Floris

답변

2

이 같은 STH를 보일 것이다 스레드를 사용 :

import threading 

def Copy_funct(DestList): 
    threads = [ threading.Thread(target=lambda dest=dest: copytree(source, dest)) 
       for dest in DestList ] 
    for thread in threads: 
    thread.start() 
    for thread in threads: 
    thread.join() 

편집 :

설명의 비트 :

스레딩 행동의 여러 스레드로 프로그램을하는 모든 분할의 방법입니다 컴퓨터에 의해 병렬로 수행됩니다. 한 스레드가 무언가 (일반적으로 I/O)를 기다려야하는 경우 다른 스레드가 자체 작업을 계속할 수 있습니다. 병렬 방식으로 작업을 수행하면 이전에 동시성을 수행하지 않았다면 들어 본 적이없는 가능성이 큰 버그의 판도라 상자가 열리 며 여기서 자세히 설명 할 수 없습니다. 하지만 당신의 유스 케이스는 그러한 문제에 부딪치지 않을 정도로 간단하다고 생각합니다.

내 함수의 첫 번째 명령문은 스레드 목록을 작성합니다 ("스레드"는 Python의 오브젝트로 표시됩니다). 이 스레드는 생성시 작업이 무엇이 될지 알려줍니다 (매개 변수 target 사용). 인수는 lambda 클로저입니다. 이렇게하면 정보 (dest)를 클로저에 쉽게 전달할 수 있습니다. 기본적으로 매개 변수 target에 전달하는 함수는 호출 될 때 copytree() 작업 중 하나에 대한 올바른 매개 변수를 호출하는 함수입니다.

두 번째 명령문은 모든 스레드에 대한 루프이며 각 스레드를 시작합니다. 그 전에 ToDo 리마인더가있는 포스트잇 노트와 같은 시작되지 않은 스레드이지만 동작은 일어나지 않습니다. start()으로 각 스레드를 시작합니다. 시작에는 사실상 시간이 필요하지 않습니다. 시작을위한 호출이 즉시 반환 될 것이므로 같은 순간에 모든 스레드를 실제로 시작할 수 있습니다. 나는 그들이 실제로 일을 시작할 때 어떤 직접적인 통제력도 갖고 있지 않다. 첫 번째 사람은 마지막 사람이 시작될 때 이미 일을 시작했을 것입니다.

세 번째 명령문은 모든 스레드에 대한 루프이며 join()을 사용하여 완료를 기다립니다. 어떤 스레드가 처음이나 마지막으로 끝나도 상관 없습니다. 먼저 첫 번째 스레드를 기다린 다음 두 번째 스레드를 기다립니다. 두 번째 스레드가 실제로 첫 번째 스레드보다 먼저 완료되면 아무 문제가 없습니다. 스레드가 완료 될 것입니다. 아직 가입하지 않은 두 번째 루프의 두 번째 반복에서 join에 의해 조인되고 올바르게 정리됩니다.

이 내용이 도움이되기를 바랍니다. 여전히 중요한 사항이 분명하지 않은 경우이 대답에 대한 추가 개선 사항을 제안하십시오.

+0

와우. 나는 나 자신을 알아낼 수 없었다. 확실히 이것은 OPs 문제를 해결할 것입니다. – Floris

+0

안녕하세요, Python IDLE 이상으로이 코드를 사용해 보았습니다. 작동하지 않는 것 같습니다. 나에게 구문 오류가 잘못되었습니다. – user3091216

+0

아마도 누군가 실제로 스레딩을 어떻게 사용하는지 이해할 수 있습니다. 내가 단서가 없기 때문에. 이것은 분명 도움이 될 것입니다! – user3091216