了解情感:类和tkinter

时间:2018-10-16 21:00:25

标签: python tkinter multiprocessing pickle pathos

我在使用情感和多处理方面取得了一定的成功。但是,酸洗是一个问题-包含tkinter(我当前的GUI)的任何东西似乎都意味着我必须非常小心,我在多处理中使用了哪个类级别的变量。当在同一个类中也有tkinter实例的任何对象上使用ProcessingPool时,似乎会将无关的数据拉到咸菜中。这使得(似乎)对与tkinter有关的任何事物进行多处理变得不必要地乏味。是否有充分的理由呢?

更具体地说,以下代码给出了预期的结果:

import tkinter as tk
from pathos.multiprocessing import ProcessingPool

class testpathos():
    def __init__(self):
        self.GUI = tk.Tk()
        self.testlist = [1,2,3,4,5]

    def testprocesspool(self):
        print(ProcessingPool().map(lambda x: squarenumber(x),self.testlist))               

   def squarenumber(x):
       return x**2 


testclass = testpathos()
testclass.testprocesspool()

它会按预期产生[1,4,9,16,25]-没有错误。

但是,以下内容-略有扩展-代码

import tkinter as tk
from pathos.multiprocessing import ProcessingPool

class testpathos():
    def __init__(self):
        self.GUI = tk.Tk()
        self.testlist = [1,2,3,4,5]
        self.powerlist = [2,3,4,5]

    def testprocesspool(self):
        print(ProcessingPool().map(lambda x: powernumber(x,self.powerlist),self.testlist))

def powernumber(x,powerlist):
    return [x**i for i in powerlist]

testclass = testpathos()
testclass.testprocesspool()

给我一​​个

TypeError: can't pickle _tkinter.tkapp objects

现在,唯一的区别是我将一个类定义的列表传递给ProcessingPool()的输入函数-并且该类定义的列表恰好是在定义了一些tkinter东西的地方定义的。如果我删除

self.GUI = tk.Tk()

行-与多处理无关-我得到[[1,1,1,1],[4,8,16,32],[9,27,81,243],[16,64, 256、1024],[25、125、625、3125]。

为此,最欢迎使用的解决方案是,即使它们与tkinter对象并存,也可以直接使用类级别的对象-以及解释为什么ProcessingPool以这种方式工作的解释。

1 个答案:

答案 0 :(得分:0)

  

这使得(似乎)对与tkinter有关的任何事物执行多处理变得不必要地乏味。有充分的理由吗?

发生错误protocol $url ${dev} http://10.200.XXX.XX/{$url} ${trial} trial.mycompany.io{$url} ${product} product.mycompany.io{$url} 的原因是Tkinter是围绕嵌入式tcl解释器的相当薄的包装器。该解释器不能同时在多个进程中运行-它被锁定到单个解释器。因此,您不能使tkinter对象腌制,因为它们需要基础的tcl解释器及其内部状态才能起作用。