باستخدام ftplib لتحميلات multithread
-
23-09-2019 - |
سؤال
أحاول إجراء تحميلات متعددة ، لكن أحصل على أخطاء. لقد خمنت أنه من المستحيل استخدام MultiThreads مع 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 ، repr 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()
معرفة ما إذا كان ذلك يتصرف بشكل أفضل.
ملاحظة: لست متأكدًا مما إذا كانت جميع علامات التبويب الخاصة بي محاذاة.