Проверить, например, многопроцессорность Python.Connection?

Connection объекты создаются при открытии файла multiprocessing.Pipe. Однако неясно, как проверить, является ли объект экземпляром Connection.

В Python3 (3.4, 3.3,! 3.2) для обнаружения экземпляра Connection я могу сделать:

from multiprocessing.connection import Connection

if isinstance(f, Connection):
  print("f is a Connection to a Pipe")

from multiprocessing.dummy.connection import Connection также работает на всех Python3, но не на Python2.

Однако это приводит к ImportError с использованием Python2. Как я должен надежно проверить объект Connection?


person Matt Shirley    schedule 16.02.2015    source источник


Ответы (2)


Существуют значительные различия в реализации между Python 2 и 3 w. р. т. многопроцессорные объекты соединения. В Python 2 вы можете импортировать их через:

from _multiprocessing import Connection

В Python 2 класс Connection реализован во вспомогательном модуле _multiprocessing, написанном на C (источник здесь). Я думаю, что он написан на C для лучшей доступности Windows API и, возможно, из соображений производительности. Я предполагаю, что в случае с Python 3 специальные вызовы Windows API, необходимые для реализации именованных каналов, были переданы в модуль winapi.

Вы можете легко, в зависимости от версии Python, либо импортировать Connection из multiprocessing.connection, либо из _multiprocessing, чтобы ваш код работал как на Python 2, так и на Python 3.

person Dr. Jan-Philip Gehrcke    schedule 16.02.2015
comment
Это именно то, что я искал. Спасибо за исчерпывающий ответ! - person Matt Shirley; 17.02.2015

Предполагая, что другие вещи, которыми может быть ваш объект, сильно отличаются от соединения, вы можете сделать что-то вроде:

if hasattr(f, 'recv'):
     print("f can be received from")

Это будет переносимо без необходимости импортировать частный класс в Python 2.

person Jim Hunziker    schedule 07.11.2016