У меня умеренный успех в использовании пафоса и многопроцессорности.Тем не менее, засоление является проблемой - и все, что содержит tkinter (мой текущий GUI), кажется, означает, что я должен быть очень осторожным, какую переменную уровня класса я использую для многопроцессорной обработки.При использовании ProcessingPool для всего, что также имеет экземпляры tkinter внутри того же класса, он, похоже, извлекает неактуальные данные для выбора.Это делает (на первый взгляд) излишне утомительным выполнение многопроцессорной обработки всего, что связано с 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 работает таким образом, приветствуются.