2010-03-31 7 views
1

다중 스레드 업로드를 시도하고 있지만 오류가 발생합니다. ftplib에서 멀티 스레드를 사용하는 것이 불가능할 수도 있습니다.다중 스레드 업로드에 ftplib 사용

인상 error_reply 같은 FTPLIB 오류

class myThread (threading.Thread): 
    def __init__(self, threadID, src, counter, image_name): 
     self.threadID = threadID 
     self.src = src 
     self.counter = counter 
     self.image_name = image_name 
     threading.Thread.__init__(self) 
    def run(self): 
     uploadFile(self.src, self.image_name) 

def uploadFile(src, image_name): 
    f = open(src, "rb")    
    ftp.storbinary('STOR ' + image_name, f) 
    f.close() 

ftp = FTP('host') # connect to host, default port 
ftp.login()    # user anonymous, passwd [email protected] 
dirname = "/home/folder/" 
i = 1 
threads = [] 

for image in os.listdir(dirname): 
    if os.path.isfile(dirname + image): 
     thread = myThread(i , dirname + image, i, image) 
     thread.start() 
     threads.append(thread)   
     i += 1 

for t in threads: 
    t.join() 

가져 오기 무리 error_reply RESP : 나는 하나 하나를 업로드하려고하면 I

로 설정 200 유형 여기

내 코드를 제공 , 다 잘 작동

+0

ftplib에 멀티 스레드 지원이 있어도 어떻게 작동합니까? 각 스레드가 동일한 파일을 모두 업로드하려고 시도합니다. –

+0

왜 똑같습니까? 만약에 'for'사이클에서 쓰레딩없이 함수를 호출하면 올바르게 작동합니다. 그것은 – Arty

+0

oops의 모든 파일을 전달하고 파일 열기 코드를 잘못 읽었습니다. 어쨌든 라이브러리가 스레드 안전 또는 동시 ftp 세션을 제공하지 않는다고 가정하는 것이 안전하다고 생각합니다. 어쨌든 –

답변

5

스레드 안에 연결 코드를 넣으려고 했습니까?

즉, 각 스레드를 FTP.host() 및 FTP.login()을 사용하여 별도의 연결로 설정합니다. 한 번에 하나씩 명령을 구문 분석 할 수 있고 두 번째 업로드 또는 "STOR"명령을 처리 할 수 ​​없기 때문에 서버는 단일 연결에서 동시에 여러 개의 업로드를 좋아하지 않을 수 있습니다. 그러나 동일한 IP 주소에서 여러 연결을 할 수있는 경우 'STOR'명령을 실행하는 별도의 세션을 갖게됩니다. 즉 더 나은 동작하는 경우

class myThread (threading.Thread): 
     def __init__(self, threadID, src, counter, image_name): 
      ############### 
      #Add ftp connection here! 
      self.ftp = FTP('host') # connect to host, default port 
      self.ftp.login()    # user anonymous, passwd [email protected] 
      ################ 
      self.threadID = threadID 
      self.src = src 
      self.counter = counter 
      self.image_name = image_name 
      threading.Thread.__init__(self) 
     def run(self): 
      uploadFile(self.src, self.image_name) 

    def uploadFile(src, image_name): 
      f = open(src, "rb")    
      self.ftp.storbinary('STOR ' + image_name, f) 
      f.close() 

    dirname = "/home/folder/" 
    i = 1 
    threads = [] 

    for image in os.listdir(dirname): 
      if os.path.isfile(dirname + image): 
      thread = myThread(i , dirname + image, i, image) 
      thread.start() 
      threads.append(thread)   
      i += 1 

     for t in threads: 
      t.join() 

참조 :

다음은 예입니다.

P. 모든 탭이 정렬되어 있는지 확실하지 않습니다.

+0

이 방법은 멀티 스레딩없이 업로드하는 것보다 느리지 만 작동합니다. 그래서 아마 다른 lib를 찾거나 한 스레드 업로드를 수행해야합니다. – Arty