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

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. Как я должен надежно проверить объект подключения?

2 ответа

Решение

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

from _multiprocessing import Connection

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

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

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

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

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

Другие вопросы по тегам