tkinter中的Python多进程-在Windows中不起作用,但在Linux中起作用

时间:2019-02-05 07:55:18

标签: python linux windows multiprocessing python-multiprocessing

我在Tkinter有一个应用程序。

此应用程序的一部分是一种方法: 它基本上获取一长串随机值,并检查随机值是否在先前定义的网格内。之后,它将它们写入另一个变量以导出它。

这是一个相当长的过程。所以我想对其进行多处理。

阅读一些有关如何执行此操作的内容。这是结果代码:

我已经阅读了SO的相关内容。我在两台计算机上都使用Anaconda-suite在Python 3.7上运行了最新的Spyder,所有(至少包括在内)软件包都是最新的,并且我已经包含了

    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计算机上运行程序时,应用程序的窗口冻结,该过程变为非活动状态,新内核自动打开并出现新窗口。

0 个答案:

没有答案