Многопроцессный Python внутри tkinter - не будет работать в Windows, но в Linux - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть приложение в 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, окно приложения зависает, процесс становится неактивным, автоматически открывается новое ядро ​​иПоявится новое окно.

...