Понимание пафоса: занятия и ткинтер - PullRequest
0 голосов
/ 17 октября 2018

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

1 Ответ

0 голосов
/ 17 октября 2018

Это делает (по-видимому) излишне утомительным выполнение многопроцессорной обработки всего, что связано с tkinter.Есть ли для этого веская причина?

Причина ошибки TypeError: can't pickle _tkinter.tkapp objects заключается в том, что Tkinter является довольно тонкой оболочкой для встроенного интерпретатора tcl.Этот интерпретатор не может быть запущен в нескольких процессах одновременно - он привязан к одному интерпретатору.Из-за этого вы не можете выбрать объект tkinter, так как для его работы требуется интерпретатор tcl и его внутреннее состояние.

...