我在使用悲情和多处理方面取得了一定的成功。然而,酸洗是一个问题 - 任何包含 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 以这种方式工作 - 是最受欢迎的。
这使得对与tkinter有关的任何事物进行多处理(似乎(变得不必要地乏味。这有什么充分的理由吗?
错误TypeError: can't pickle _tkinter.tkapp objects
的原因是 Tkinter 是嵌入式 tcl 解释器的相当薄的包装器。此解释器不能同时在多个进程中运行 - 它被锁定到单个解释器。因此,您无法泡菜 tkinter 对象,因为它们需要底层 tcl 解释器及其内部状态才能运行。