ftp连接的{python多线程文件上传问题

时间:2017-04-19 11:02:51

标签: python multithreading ftp

以下是此操作的完整代码:

import threading
import queue
import time
import re
import pprint
import ftplib


list_unvalid = []
list_valid = []

mylock = threading.RLock()

class StatusControl():

    def __init__(self, data):
        self.data = data
        self.data_count = len(data)
        self.total_processed = 0
        self.percent_diff = 5
        self.last_percent = 0      
        self.total_valid = 0  

    def addTotal(self):
        self.total_processed += 1

    def getDataLen(self):
        return self.data_count

    def gerCurrPercent(self):
        return self.last_percent

    def checkPercentDiff(self):
        current_percent =  int(( self.total_processed / self.data_count ) * 100)
        if current_percent - self.last_percent >= self.percent_diff:
            self.last_percent = current_percent
            return True
        return False

    def addValid(self):
        self.total_valid += 1

def worker_function(input_queue, output_queue, status_control):
    global list_unvalid, list_valid

    while True:
        try:
            data = input_queue.get_nowait()
        except queue.Empty:
            break
        #print("checking " + str(data))
        try:

            #line = 'username:password@my.domain.com/dir/aaa/aaa domain.com'
            data = data.replace('ftp://', '')
            login_data = re.findall('(.+?):(.+?)@(.+?)(/.[^\s]+)\s*(.*)', data, flags=re.IGNORECASE)
            print(login_data)
            login = login_data[0][0]
            password = login_data[0][1]
            host = login_data[0][2]
            directory = login_data[0][3]            
            try:
                url = login_data[0][4]
            except IndexError:
                url = 'http://' + host            
            ftp_connection = ftplib.FTP(host, login, password)
            #ftp_connection.login()
            ftp_connection.cwd(directory)
            dirs = ftp_connection.nlst()
            print(dirs)
            ftp_connection.close()
            status_control.addTotal()
            mylock.acquire()
            diff = status_control.checkPercentDiff()
            if diff == True:
                print(status_control.gerCurrPercent() + '%')
            mylock.release()       
            output_queue.put_nowait(data)

        except Exception as e:
            print(str(e))

        input_queue.task_done()


def main():
    start_t = time.time()

    f = open('ftp.txt', 'r')
    lines = f.readlines()
    lines = [line.strip() for line in lines]


    in_queue = queue.Queue()
    out_queue = queue.Queue()

    for line in lines:
        if(line.strip() == ''):
            continue
        data = line
        in_queue.put_nowait(data)

    status_control = StatusControl(lines)

    worker_threads = 100
    threads = []
    for thr in range(worker_threads):
        thread = threading.Thread(target=worker_function, args=(in_queue, out_queue, status_control))
        thread.daemon = True
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

    out_list = []


    while True:
        try:
            info = out_queue.get_nowait()           
            out_list.append(info)
        except queue.Empty:
            break
    print(out_list)
    total_time = time.time() - start_t
    print('Total time ' + str(total_time) + ' seconds')

if __name__ == '__main__':
    main()

当我在我的文件中有2-3个ftp帐户时它可以正常工作,但是当我有20到30个或更多时,我有错误WinError 10061连接被拒绝。如何解决这个问题?谢谢!

UPD:我对php + pthreads(ftp_connect)

有同样的问题

0 个答案:

没有答案