我在使用情感和多处理方面取得了一定的成功。但是,酸洗是一个问题-包含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以这种方式工作的解释。
答案 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解释器及其内部状态才能起作用。