Использование ftplib для многопоточных загрузок

StackOverflow https://stackoverflow.com/questions/2549829

  •  23-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь выполнять многопоточные загрузки, но получаю ошибки.Я предположил, что, возможно, невозможно использовать многопоточность с 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 anonymous@   
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()

Получите кучу ошибок ftplib, таких как

вызвать error_reply, соответственно error_reply:200 Введите значение I

Если я попытаюсь загружать один за другим, все будет работать нормально

Это было полезно?

Решение

Вы пытались поместить код подключения внутрь потока?

Другими словами, сделайте так, чтобы каждый поток выполнял свое собственное отдельное соединение с 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 anonymous@   
             ################
             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.S.Не уверен, что все мои вкладки выровнены.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top