#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()