Pregunta

Estoy tratando de hacer subidas multiproceso, pero obtener errores. Supuse que tal vez sea imposible utilizar multithreads con ftplib?

Aquí viene mi código:

    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()

Obtener montón de errores ftplib como

aumento error_reply, resp error_reply: 200 Tipo conjunto de I

Si trato de subir uno por uno, todo funciona bien

¿Fue útil?

Solución

¿Usted ha intentado poner el código de conexión en el interior del hilo?

En otras palabras, hacer que cada hilo de hacer su propia conexión independiente con FTP.host () y FTP.login (). El servidor no como múltiples archivos al mismo tiempo en una única conexión, ya que puede ser parseando comandos uno a la vez y no puede manejar una segunda carga o comando "STOR". Pero si se puede hacer múltiples conexiones desde la misma dirección IP, tendrá sesión separada en la que se dé la orden 'STOR'.

Este es un ejemplo:

    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()

A ver si eso se comporta mejor.

P.S. No estoy seguro si todos mis pestañas están alineadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top