Пул многопроцессорной обработки Python открывает новое окно

#python #python-multiprocessing

Вопрос:

Всем доброго вечера,

Я создал тяжелую функцию процессора, которую мне нужно повторить 50 раз с вводом из списка, а затем я использую пул многопроцессорной обработки для синхронного вычисления 50 функций. Это работает, но создает новое окно для каждого нового процесса, и только после того, как я закрываю эти окна, я получаю результат. Есть ли способ не открывать окно каждый раз? Я пробовал несколько методов многопроцессорной обработки, но все они делают одно и то же.

 import sqlite3
import random
import time
import concurrent.futures
from multiprocessing import Pool
from tkinter import *
import time

window = Tk()

window.title("APP")

def bigF(list):
            n=list[0]   # Extract multiple var from list
            n2=list[1]
            
            new = f(n)  # The CPU heavy computation.
            
            if n2 == new:
                return True
            else:
                return False

def Screen1():
           
    window.geometry("350x250")
    
    # Lables and entry windows.
        
    btn = Button(window, text='S2', command=Screen2)
    btn.pack(pady=10)
    
def Screen2():
            
    window.geometry("350x220")
    
    # Lables and entry windows.
    
    def getP():
        user = user.get()
        cursor.execute(database)
        try:
           return cursor.fetchall()[0][0]
        except IndexError:
           raise ValueError('')
    
    def getS():
        user = user.get()
        cursor.execute(database)
        return cursor.fetchall()[0][0]
    
    def getS2():
        user = user.get()
        cursor.execute(database)
        return cursor.fetchall()[0][0]
    
    def function():
        
        try:
            var = getP()
        except ValueError:
            return False
        s = getS()
        s2 = getS2()
        t = t.get()
                    
        if __name__ == '__main__':
            list1=[]
            listt=[]
            list3=[]
            list1[:0]=somestring
            random.shuffle(list1)
            
            for i in range(len(list1)):
                listt.append(list1[i])
                listt.append(var)
                listt.append(s)
                listt.append(s2)
                listt.append(t)
                list3.append(listt)
                listt=[]
            with Pool(50) as p:
                values = p.map(bigF, list3)
        
        if True in values:
                someF()
        else:
                # Lables

         
    btn = Button(window, text='function', command=function)
    btn.pack(pady=10)
    
    sgn =  Button(window, text='S1', command=Screen1)
    sgn.pack(padx=10, side=RIGHT)
    
def someF():
            
    window.geometry("350x350")
    # Lables and entry windows.

Screen1()
window.mainloop()
 

Я не знаю, в чем проблема-в bIGF(списке) или в многопроцессорности. Я стремлюсь сократить время обработки до менее чем 2 секунд, где 1 bIGF(список) занимает около 0,5 секунды.

Спасибо вам за любые предложения и комментарии.

Ответ №1:

Вам нужно прочитать предостережения в multiprocessing документе. Когда ваши вторичные процессы запускаются, он запускает новую копию интерпретатора и повторно выполняет ваш основной код. Это включает в себя запуск нового главного окна. Все, что должно выполняться в основном процессе, должно быть только внутри if __name__=='__main__': . Так что вам нужно:

 if __name__ == '__main__':
    windows = Tk()
    window.title("APP")
    Screen1()
    window.mainloop()