Проверьте, например, многопроцессорность 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.