Utilizzando ftplib per il caricamento multithread
-
23-09-2019 - |
Domanda
che sto cercando di fare uploads multithread, ma ottenere gli errori. Intuii che forse è impossibile utilizzare multithreads con ftplib?
Ecco che arriva il mio codice:
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()
Ottenere mucchio di errori ftplib come
alzare error_reply, resp error_reply: 200 Tipo impostato su I
Se provo a caricare uno per uno, tutto funziona bene
Soluzione
Hai provato a mettere il codice di connessione all'interno del filo?
In altre parole, fanno ogni filo do propria connessione separata con FTP.host () e FTP.login (). Il server non può, come upload multipli allo stesso tempo su una singola connessione, perché può essere parsing comandi uno alla volta e non è in grado di gestire un secondo caricamento o comando "STOR". Ma se si può fare connessioni multiple dallo stesso indirizzo IP, dovrete sessione separata su cui eseguire il comando 'STOR'.
Ecco un esempio:
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()
Vedere se che si comporta meglio.
P.S. Non so se tutte le mie schede sono allineate.