⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scheduler.py

📁 BitTorrentABC-Linux-V.2.4.3源码
💻 PY
📖 第 1 页 / 共 4 页
字号:
                    self.proctab[i][self.DEST] = path.join(self.abcparams['defaultfolder'], info['name'])
                    self.proctab[i][self.STATUS] = "queue"
                    self.proctab[i][self.PRIO] = 2          # Priority "Normal"
                    self.proctab[i][self.DONEFLAG] = None       # Done flag
                    self.proctab[i][self.FILENAME] = info['name']
                    self.proctab[i][self.MAXUPLOAD]     = self.abcparams['maxupload']
                    self.proctab[i][self.MAXUPLOADRATE] = self.abcparams['maxuploadrate']
                    self.proctab[i][self.UPLOADOPT]     = self.abcparams['uploadoption']
                    self.proctab[i][self.UPLOADTIMEH]   = self.abcparams['uploadtimeh']
                    self.proctab[i][self.UPLOADTIMEM]   = self.abcparams['uploadtimem']
                    self.proctab[i][self.UPLOADRATIO]   = self.abcparams['uploadratio']
                    self.proctab[i][self.DETAIL_ADR]    = None
                    self.proctab[i][self.DOWNSIZE]      = 0.0
                    self.proctab[i][self.UPSIZE]        = 0.0

                    getslot = 1
                    numslot = i
                    break
            if getslot == 0:
                return        
            self.parent.list.InsertStringItem(numslot, "")
            #Add Status info in List
            for rank in range(0, self.guiman.getNumCol()):
                colid = self.guiman.getIDfromRank(rank)
                if colid == 4:
                    self.parent.list.SetStringItem(numslot, rank, self.proctab[numslot][self.FILENAME])
                elif colid == 6:
                    self.parent.list.SetStringItem(numslot, rank, "queue")
                elif colid == 7:
                    self.parent.list.SetStringItem(numslot, rank, self.priotext[self.proctab[numslot][self.PRIO]])
                else:
                    self.parent.list.SetStringItem(numslot, rank, "")

            self.updateTorrentList()
            self.Scheduler()
        
    def addOldProc(self, oldproc_array):

        numproc = len(oldproc_array)
        for i in range(0, numproc):
            #if self.proctab[i][self.LISTINDEX] == -1:
                self.proctab[i][self.LISTINDEX]     = -2    
                self.proctab[i][self.ABCENGINE_ADR] = None  
                self.proctab[i][self.SRC]           = oldproc_array[i][1]
                self.proctab[i][self.DEST]          = oldproc_array[i][2]
                self.proctab[i][self.STATUS]        = oldproc_array[i][3]
                self.proctab[i][self.PRIO]          = int(oldproc_array[i][4])
                self.proctab[i][self.DONEFLAG]      = None 
                self.proctab[i][self.FILENAME]      = oldproc_array[i][0]
                self.proctab[i][self.MAXUPLOAD]     = self.abcparams['maxupload']
                self.proctab[i][self.MAXUPLOADRATE] = self.abcparams['maxuploadrate']
                self.proctab[i][self.UPLOADOPT]     = self.abcparams['uploadoption']
                self.proctab[i][self.UPLOADTIMEH]   = self.abcparams['uploadtimeh']
                self.proctab[i][self.UPLOADTIMEM]   = self.abcparams['uploadtimem']
                self.proctab[i][self.UPLOADRATIO]   = self.abcparams['uploadratio']
                self.proctab[i][self.DETAIL_ADR]    = None
                self.proctab[i][self.DOWNSIZE]      = float(oldproc_array[i][5])
                self.proctab[i][self.UPSIZE]        = float(oldproc_array[i][6])
                        
                self.parent.list.InsertStringItem(i, "")
                
                for rank in range(0, self.guiman.getNumCol()):
                    colid = self.guiman.getIDfromRank(rank)
                    if colid   == 4:        # Title column
                        self.list.SetStringItem(i, rank, self.proctab[i][self.FILENAME])
                    elif colid == 6:        # BT status column
                        self.list.SetStringItem(i, rank, self.proctab[i][self.STATUS])
                    elif colid == 7:
                        self.list.SetStringItem(i, rank, self.priotext[self.proctab[i][self.PRIO]])
                    elif colid == 12:
                        if int(self.proctab[i][self.DOWNSIZE]) == 0 :
                            self.list.SetStringItem(i, rank, 'oo %')
                        else:
                            self.list.SetStringItem(i, rank, '%.1f'%((self.proctab[i][self.UPSIZE]/self.proctab[i][self.DOWNSIZE])*100) + "%")
                    elif colid == 18:
                        self.list.SetStringItem(i, rank, ('%.2f MB' % (self.proctab[i][self.DOWNSIZE] / (1 << 20))))
                    elif colid == 19:
                        self.list.SetStringItem(i, rank, ('%.2f MB' % (self.proctab[i][self.UPSIZE] / (1 << 20))))                        
                    else:                        
                        self.list.SetStringItem(i, rank, "")
                        
                #self.list.SetStringItem(i, 0, self.proctab[i][self.FILENAME])
                #self.list.SetStringItem(i, 1, "")
                #self.list.SetStringItem(i, 2, self.proctab[i][self.STATUS])
                #self.list.SetStringItem(i, 3, self.priotext[self.proctab[i][self.PRIO]])
                #self.list.SetStringItem(i, 4, "")
                #self.list.SetStringItem(i, 5, "")
                #self.list.SetStringItem(i, 6, "")
                #self.list.SetStringItem(i, 7, "")
                #self.list.SetStringItem(i, 8, "")        

        self.invokeLater(self.Scheduler)                

    def runProc(self, index, firsttime_flag):
        self.proctab[index][self.DONEFLAG] = Event()
        self.proctab[index][self.LISTINDEX] = index
        self.proctab[index][self.STATUS] = "working"
        self.proctab[index][self.ABCENGINE_ADR] = ABCEngine(self, index, firsttime_flag,
                                                            self.proctab[index][self.DONEFLAG],
                                                            self.proctab[index][self.PRIO],
                                                            self.guiman,
                                                            self.proctab[index][self.DOWNSIZE],
                                                            self.proctab[index][self.UPSIZE]
                                                            )
        # Construct BT params
        ###########################
        btparams = []
        btparams.append("--responsefile")
        btparams.append(self.proctab[index][self.SRC])
        btparams.append("--minport")
        btparams.append(self.abcparams['minport'])
        btparams.append("--maxport")
        btparams.append(self.abcparams['maxport'])
        btparams.append("--max_uploads")
        btparams.append(self.proctab[index][self.MAXUPLOAD])
        btparams.append("--min_uploads")
        btparams.append(self.proctab[index][self.MAXUPLOAD])

        if self.abcparams['ip'] != '':
            btparams.append("--ip")
            btparams.append(self.abcparams['ip'])
        if self.abcparams['bind'] != '':
            btparams.append("--bind")
            btparams.append(self.abcparams['bind'])

        btparams.append("--min_peers")
        btparams.append(self.abcparams['min_peers'])
        btparams.append("--alloc_type")
        btparams.append(self.abcparams['alloc_type'])
        btparams.append("--alloc_rate")
        btparams.append(self.abcparams['alloc_rate'])
        btparams.append("--max_files_open")
        btparams.append(self.abcparams['max_files_open'])
        btparams.append("--max_connections")
        btparams.append(self.abcparams['max_connections'])

        btparams.append("--max_upload_rate")
        max_upload_rate = int(self.proctab[index][self.MAXUPLOADRATE])
        # if someone cheat by edit abc.conf to less than 3 kb/s
        # make it to unlimited !!! *devil* :D
        if max_upload_rate != 0 and max_upload_rate < 3:
            btparams.append(str("0"))
        else:        
            btparams.append(self.proctab[index][self.MAXUPLOADRATE])
        
        btparams.append("--max_initiate")
        nummaxupload = int(self.proctab[index][self.MAXUPLOAD])
        if nummaxupload < 4 :
            btparams.append(str(min(12, int(self.abcparams['max_initiate']))))
        elif nummaxupload < 30:
            btparams.append(str(min(40, int(self.abcparams['max_initiate']))))
        else:
            btparams.append(str(min(nummaxupload+10, int(self.abcparams['max_initiate']))))
        
        if self.proctab[index][3] != "":
            btparams.append("--saveas")
            btparams.append(self.proctab[index][self.DEST])

        for rank in range(0, self.parent.guiman.getNumCol()):
            ID = self.parent.guiman.getIDfromRank(rank)
            if ID == 6:   
                self.list.SetStringItem(index, rank, "Waiting..")
            
        thread = Thread(target = runBT, args = [btparams, self.proctab[index][self.ABCENGINE_ADR],
                                               self.proctab[index][self.DONEFLAG]])
        thread.setDaemon(false)
        thread.start()

    def changeDEST(self, index, dest):
        self.proctab[index][self.DEST] = dest
        
    def changePriority(self, index, prio):        
        self.proctab[index][self.PRIO] = prio
        if self.proctab[index][self.LISTINDEX] != -2:
            self.proctab[index][self.ABCENGINE_ADR].changePrio(prio)
            
    def getPriority(self, index):
        return self.proctab[index][self.PRIO]
        
    def changeSTATUS(self, index, status):
        self.proctab[index][self.STATUS] = status
        
    def changeFILENAME(self, index, filename):
        self.proctab[index][self.FILENAME] = filename
        
    def updateTorrentList(self):
            torrentlist = TorrentListFileManager()
            torrentlist.open(path.join(self.parent.abcpath, "torrent.lst"), "w")
            for i in range(0, self.maxtorrent):
                if self.proctab[i][self.LISTINDEX] == -1:
                    break
                if self.proctab[i][self.FILENAME] == "":
                    continue
                
                status = self.proctab[i][self.STATUS]
                if status == "working":
                    status = "queue"
                torrentlist.appendList(self.proctab[i][self.FILENAME],
                                       self.proctab[i][self.SRC],
                                       self.proctab[i][self.DEST],
                                       status,
                                       self.proctab[i][self.PRIO],
                                       self.proctab[i][self.DOWNSIZE],
                                       self.proctab[i][self.UPSIZE])
            torrentlist.close()
        
        
    def Scheduler(self):
        if self.currentproc >= int(self.maxnumsim):
            return
        # Choose job by highest priority
        #################################
        for priority in range(0, 5):
            done = 0
            for i in range(0, self.maxtorrent):
                if self.proctab[i][self.LISTINDEX] == -1:
                    break
                if self.proctab[i][self.PRIO] != priority:
                    continue
                
                if self.proctab[i][self.STATUS] == "queue" and self.currentproc < int(self.maxnumsim):
                   self.runProc(i, 0) #it will run before close :-\
                   self.currentproc += 1
                   if self.currentproc >= int(self.maxnumsim):
                       done = 1
                       break
            if (done):
                break        


    def getLocalInfo(self, index):
        return ([self.proctab[index][self.MAXUPLOAD],  self.proctab[index][self.MAXUPLOADRATE],
                self.proctab[index][self.UPLOADOPT],   self.proctab[index][self.UPLOADTIMEH],
                self.proctab[index][self.UPLOADTIMEM], self.proctab[index][self.UPLOADRATIO]])

                
    def changeLocalInfo(self, index, info):
        if self.proctab[index][self.LISTINDEX] == -1:
            return
        self.proctab[index][self.MAXUPLOAD]     = info[0]
        self.proctab[index][self.MAXUPLOADRATE] = info[1]
        if self.proctab[index][self.LISTINDEX] == -2 or self.proctab[index][self.STATUS] != "completed" :
            self.proctab[index][self.UPLOADOPT]     = info[2]
        self.proctab[index][self.UPLOADTIMEH]   = info[3]
        self.proctab[index][self.UPLOADTIMEM]   = info[4]
        self.proctab[index][self.UPLOADRATIO]   = info[5]
        
        if self.proctab[index][self.LISTINDEX] != -2:   #active process
            if self.proctab[index][self.ABCENGINE_ADR].config is None:
                self.proctab[index][self.ABCENGINE_ADR].config = self.proctab[index][self.ABCENGINE_ADR].dow.getConfig()
            self.proctab[index][self.ABCENGINE_ADR].config['max_upload_rate'] = int(info[1]) * 1000
            nummaxupload = int(info[0])
            self.proctab[index][self.ABCENGINE_ADR].config['max_uploads']  = nummaxupload
            self.proctab[index][self.ABCENGINE_ADR].config['min_uploads'] = nummaxupload
            self.proctab[index][self.ABCENGINE_ADR].dow.setUploadRate()

            if nummaxupload < 4:                
                self.proctab[index][self.ABCENGINE_ADR].config['max_initiate'] = 12
            elif nummaxupload < 30:
                self.proctab[index][self.ABCENGINE_ADR].config['max_initiate'] = 40
            else:
                self.proctab[index][self.ABCENGINE_ADR].config['max_initiate'] = nummaxupload+10

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -