У меня есть приложение в Tkinter.
Частью этого приложения является метод: он в основном принимает длинные списки случайных значений и проверяет, находятся ли случайные значения внутри ранее определенной сетки.После этого он записывает их в другую переменную для экспорта.
Это довольно длительный процесс.Так что я бы хотел многопроцессорность.
Прочтите кое-что о том, как это сделать.Вот результирующий код:
Я перечитал SO для вещей, которые могут иметь отношение.Я использую обновленный Spyder с Python 3.7 как часть пакета Anaconda на обеих машинах, все (по крайней мере, включены) пакеты обновлены, и я включил
if __name__ == '__main__':
-линии.Я также экспериментировал с отступом
p.start()
и
processes.append(p)
Просто не могу заставить его работать.
def ParallelStuff(myIn1, myIn2, myIn3, myIn4, anotherIn1, anotherIn2, anotherIn3, return_dict, processIterator):
tempOut1 = np.zeros(len(myIn1)) # myIn1, myIn2, myIn3 are of the same length
tempOut2 = np.zeros(len(myIn1))
tempOut3 = np.zeros(len(myIn1))
bb = 0
for i in range(len(myIn3)):
xx = myIn3[i]
yy = myIn4[i]
hits = np.isin(anotherIn1, xx)
goodY = anotherIn3[np.where(hits==1)]
if np.isin(yy, goodY):
tempOut1[bb] = myIn1[i]
tempOut2[bb] = myIn2[i]
tempOut3[bb] = anotherIn3
bb += 1
return_dict[processIterator] = [tempOut1, tempOut1, tempOut3]
nCores = multiprocessing.cpu_count()
def export_Function(self):
out1 = np.array([])
out2 = np.array([])
out3 = np.array([])
for loop_one in range(0, N):
# ...
# stuff that works on both systems with only one core...
# ... and on linux with all cores
processes = []
nTotal = int(len(xRand))
if nTotal%nCores == 0:
o = int(nTotal/nCores)
else:
o = int(nTotal/(nCores-1))
manager = multiprocessing.Manager()
return_dict = manager.dict()
for processIterator in range (nCores):
offset = o*i
myIn1 = in1[offset : min(nTotal, offset + o)]
myIn2 = in2[offset : min(nTotal, offset + o)]
myIn3 = in3[offset : min(nTotal, offset + o)]
myIn4 = in4[offset : min(nTotal, offset + o)]
if __name__ == '__main__':
p = multiprocessing.Process(target = ParallelStuff, args = (myIn1, myIn2, myIn3, myIn4, anotherIn1, anotherIn2, anotherIn3, return_dict, processIterator))
p.start()
processes.append(p)
for p in range(len(processes)):
processes[p].join()
myOut1 = return_dict[p][0]
myOut2 = return_dict[p][1]
myOut3 = return_dict[p][2]
out1 = np.concatenate((out1, myOut1[np.where(myOut1 != 0)]))
out2 = np.concatenate((out2, myOut2[np.where(myOut2 != 0)]))
out3 = np.concatenate((out3, myOut3[np.where(myOut3 != 0)]))
Когда я запускаю свою программуна моей машине с Linux он делает именно то, что должен.Распределить по всем 8 ядрам, вычислить, объединить 3 результата в соответствующих массивах, экспортировать.
Когда я запускаю свою программу на моей машине с Windows, окно приложения зависает, процесс становится неактивным, автоматически открывается новое ядро иПоявится новое окно.