Как наследовать от мультипроцессинга. Трубка? - PullRequest
0 голосов
/ 13 января 2019

Я хочу построить класс-оболочку вокруг объекта multiprocessing.Pipe в Python. Наследование от модуля multiprocessing, как известно, имеет свои проблемы (см. здесь для аналогичного вопроса, обсуждающего наследование для multiprocessing.Queue), и я столкнулся с ошибкой, которую не могу разрешить.

Давайте рассмотрим простой пример:

from multiprocessing import Pipe


class MyClass1: pass


class MyClass2(Pipe, MyClass1):
    pass

Здесь мы создаем класс MyClass2, который наследуется как от класса Pipe, так и от пользовательского класса MyClass1. Запуск вышеупомянутого повысит

TypeError: metaclass conflict: the metaclass of a derived class
 must be a (non-strict) subclass of the metaclasses of all its bases

Я знаю, что для решения этой ошибки мне, вероятно, придется ввести метакласс, от которого MyClass2 может наследоваться, но когда я пытаюсь определить метакласс объекта Pipe, используя type(Pipe), я получаю <class 'type'>, который не помогает вообще.

В вопросах переполнения стека, с которыми я связывался выше, упоминается, что по существу существует особый способ наследования Queue. Есть ли также специальный способ для Pipe? Любые предложения о том, как избежать этой ошибки?

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Нет класса Pipe. Это работает для multiprocessing.Queue, потому что есть класс multiprocessing.queues.Queue, но multiprocessing.Pipe просто поддерживается другой функцией Pipe в multiprocessing.connection.py.

Вы пытаетесь наследовать от функции, которая всегда возвращает два объекта соединения. Вы бы предпочли создать подкласс для различных объектов соединений, которые Pipe может вернуть. Какие объекты соединения это будут, зависит от ОС и зависит от того, должно ли соединение быть дуплексным / симплексным. Я сомневаюсь, что это было бы хорошей идеей, хотя. (Взгляните на multiprocessing.connection.py, чтобы вылечиться от этой идеи;)

Я бы предложил создать собственную функцию MyPipe, чтобы она вызывала multiprocessing.Pipe внутри и позволяла добавлять, что вам нужно, к возвращаемым объектам соединения.

0 голосов
/ 13 января 2019

Из документации по питону. https://docs.python.org/3.7/library/multiprocessing.html

Функция Pipe () возвращает пару объектов подключения, соединенных каналом, который по умолчанию является дуплексным (двусторонним).

Pipe - это метод, и поэтому вы не можете наследовать от него.

...