Многопроцессорная обработка в классе не использует полный диапазон процессоров - PullRequest
0 голосов
/ 30 октября 2019

У меня есть программа, которая при запуске открывает графический интерфейс пользователя, который позволяет пользователю выбрать необработанный файл, который затем читается, и вызывается функция для вычисления некоторого материала, который затем сохраняется в файле выбора.

В зависимости от размера файла это может занять до 12 и более часов. (тяжелые вычисления) Поэтому мой подход состоял в том, чтобы позволить Программе выполнять вычисления в различных процессах с помощью многопроцессорного модуля. Но, похоже, я не использую весь спектр процессора. Когда я запускаю первый процесс, загрузка ЦП возрастает примерно с 4-5% до примерно 20%, но когда я запускаю второй процесс, он остается на уровне примерно 20%

Код слишком велик, чтобы разместить его здесь, поэтомуя пытаюсь объяснить это как можно лучше

class main():
    def __init__(self,master):
            self.processes= {'1': 0, '2' :0, '3' :0,'4':0,'5':0,'6':0}
            self.master = master
            self.master.title("Framework")
            self.master.minsize(1450, 650)
            self.master.maxsize(1450,650)
            style = ttk.Style()
            style.theme_use('clam')
            style.configure('Custom.TButton',background='#94FDFA')
            self.Box4 = Entry(self.master)
            self.text = Text(self.master)
            self.scroll = Scrollbar(self.master, command=self.text.yview)
            self.text.configure(yscrollcommand=self.scroll.set)
            self.text.tag_configure('bold_italics', font=('Verdana', 12, 'bold', 'italic'))
            self.text.place( x = 450, y =80,bordermode="inside", width=300,height=250)
            self.scroll.place(x=750,y=80, height= 250)

            self.text2 = Text(self.master)
            self.scroll2 = Scrollbar(self.master, command=self.text.yview)
            self.text2.configure(yscrollcommand=self.scroll2.set)
            self.text2.tag_configure('bold_italics', font=('Verdana', 12, 'bold', 'italic'))
            self.text2.place( x = 775, y =80,bordermode="inside", width=300,height=250)
            self.scroll2.place(x=1075,y=80, height= 250)            

            self.text3 = Text(self.master)
            self.scroll3 = Scrollbar(self.master, command=self.text.yview)
            self.text3.configure(yscrollcommand=self.scroll3.set)
            self.text3.tag_configure('bold_italics', font=('Verdana', 12, 'bold', 'italic'))
            self.text3.place( x = 1100, y =80,bordermode="inside", width=300,height=250)
            self.scroll3.place(x=1400,y=80, height= 250)     

            self.text4 = Text(self.master)
            self.scroll4 = Scrollbar(self.master, command=self.text.yview)
            self.text4.configure(yscrollcommand=self.scroll4.set)
            self.text4.tag_configure('bold_italics', font=('Verdana', 12, 'bold', 'italic'))
            self.text4.place( x = 450, y =370,bordermode="inside", width=300,height=250)
            self.scroll4.place(x=750,y=370, height= 250)

            self.text5 = Text(self.master)
            self.scroll5 = Scrollbar(self.master, command=self.text.yview)
            self.text5.configure(yscrollcommand=self.scroll5.set)
            self.text5.tag_configure('bold_italics', font=('Verdana', 12, 'bold', 'italic'))
            self.text5.place( x = 775, y =370,bordermode="inside", width=300,height=250)
            self.scroll5.place(x=1075,y=370, height= 250)            

            self.text6 = Text(self.master)
            self.scroll6 = Scrollbar(self.master, command=self.text.yview)
            self.text6.configure(yscrollcommand=self.scroll6.set)
            self.text6.tag_configure('bold_italics', font=('Verdana', 12, 'bold', 'italic'))
            self.text6.place( x = 1100, y =370,bordermode="inside", width=300,height=250)
            self.scroll6.place(x=1400,y=370, height= 250)  
            self.Box4.place( x = 10, y = 10,bordermode="inside", width=820,height=35)
            self.b1 = ttk.Button(self.master,text = "Folder", command=self.select_folder)
            self.b1.place(x=850, y=10)   
            self.b2 = ttk.Button(self.master, text="run", command=self.go)
            self.b2.place(x=20, y=600)
            self.master.geometry('%dx%d+%d+%d' % (950, 400, 20, 20))


    def update(self, tid):
        try:
            if tid == self.processes['2']:
                self.text.insert(END, (self.text1 + '\n'))
                self.text.see("end")
        except IndexError:
            return
        except AttributeError:
            return                
        try:
            if tid == self.processes['1']:
                self.text2.insert(END, (self.text1 + '\n'))
                self.text2.see("end")        
        except IndexError:
            return
        except AttributeError:
            return
        try:
            if tid == self.processes['3']:
                self.text3.insert(END, (self.text1 + '\n'))
                self.text3.see("end")
        except IndexError:
            return
        except AttributeError:
            return                
        try:
            if tid == self.processes['4']:
                self.text4.insert(END, (self.text1 + '\n'))
                self.text4.see("end")        
        except IndexError:
            return
        except AttributeError:
            return
        try:
            if tid == self.processes['5']:
                self.text5.insert(END, (self.text1 + '\n'))
                self.text5.see("end")
        except IndexError:
            return
        except AttributeError:
            return                
        try:
            if tid == self.processes['6']:
                self.text6.insert(END, (self.text1 + '\n'))
                self.text6.see("end")        
        except IndexError:
            return
        except AttributeError:
            return       

    def select_folder(self):
        mas = tk.Toplevel()
        mas.withdraw()
        dir_path = filedialog.askdirectory()
        self.Box4.insert(0,str(dir_path))
        self.dir_path = dir_path          

    def go(self):
        Thread(target = self.spawn).start()

    def spawn(self):
                while True:
                    if self.processes['1'] == 0:
                        proc = 1
                        p = multiprocessing.Process(target=self.run(proc))
                        p.start()
                        p.join()                        
                        break
                    if self.processes['2'] == 0:
                        proc = 2
                        p2 = multiprocessing.Process(target=self.run(proc))
                        p2.start()
                        p2.join()  
                        break
                    if self.processes['3'] == 0:
                        proc = 3
                        p3 = multiprocessing.Process(target=self.run(proc))
                        p3.start()
                        p3.join() 
                        break
                    if self.processes['4'] == 0:
                        proc = 4
                        p4 = multiprocessing.Process(target=self.run(proc))
                        p4.start()
                        p4.join() 
                        break
                    if self.processes['5'] == 0:
                        proc = 5
                        p5 = multiprocessing.Process(target=self.run(proc))
                        p5.start()
                        p5.join() 
                        break
                    if self.processes['6'] == 0:
                        proc = 6 
                        p6 = multiprocessing.Process(target=self.run(proc))
                        p6.start()
                        p6.join() 
                        break 


    def run(self, process):
            while True:
                if self.processes['1'] == 0:
                    self.processes['1'] = process
                    self.text.delete('1.0', END)
                    me = 1
                    break
                if self.processes['2'] == 0:
                    self.processes['2'] = process
                    self.text2.delete('1.0', END)
                    me = 2
                    break
                if self.processes['3'] == 0:
                    self.processes['3'] = process
                    self.text3.delete('1.0', END)
                    me = 3
                    break
                if self.processes['4'] == 0:
                    self.processes['4'] = process
                    self.text4.delete('1.0', END)
                    me = 4
                    break
                if self.processes['5'] == 0:
                    self.processes['5'] = process
                    self.text5.delete('1.0', END)
                    me = 5
                    break
                if self.processes['6'] == 0:
                    self.processes['6'] = process
                    self.text6.delete('1.0', END)
                    me = 6
                    break
                else:
                    return
            time.sleep(2)
            self.text1 = "done 1/10"
            self.update(me)
            time.sleep(5)  
            self.text1 = "done 2/10"
            self.update(me) 
            time.sleep(3)             
            self.text1 = "done 3/10"
            self.update(me)
            time.sleep(8)
            self.text1 = "done 4/10"
            self.update(me)
            time.sleep(2) 
            self.text1 = "done 5/10"
            self.update(me)            
            if me== 1:
                self.processes['1'] = 0
            if me== 2:
                self.processes['2'] = 0
            if me== 3:
                self.processes['3'] = 0            
            if me== 4:
                self.processes['4'] = 0
            if me== 5:
                self.processes['5'] = 0
            if me== 6:
                self.processes['6'] = 0  

if __name__ == '__main__':     
    master = tk.Tk()
    ma = main(master)
    master.mainloop()

Я новичок в многопроцессорной обработке, поэтому, если у вас есть хороший совет для меня, как это сделать правильно, я был бы очень благодарен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...