cppzmq: возможно ли получить глобальный контекст, не создавая его в качестве глобальной переменной? - PullRequest
1 голос
/ 31 октября 2019

Мои сценарии обычно включают только один глобальный контекст. AFAIK, pyzmq имеет API zmq.Context.instance() для получения глобального синглтона, но я не смог найти эквивалентный cppzmq API.

Возможно ли получить доступ к глобальному контексту, не создавая его явнои отследить это?

1 Ответ

1 голос
/ 31 октября 2019

Q : Возможно ли иметь доступ к глобальному контексту без необходимости создавать его явно и отслеживать его ?

Нет, по крайней мере, не без основной работы по реконструкции текущего cppzmq

ПРИЧИНА:

PyZMQ недавно начал не должен совпадать с как обычная привязка языка Python для работы с опубликованным общим API ZeroMQ.

Больше, чем просто привязки

PyZMQ якобы является связыванием Python для ØMQ, но проект, следуя философии Python «включенные батареи», предоставляет больше, чем просто методы и объекты Python для вызова в библиотеку ØMQ C ++. Ядро как привязки

PyZMQ в настоящее время разбит на четыре подпакета. Во-первых, это Core. zmq.core содержит фактические привязки для ZeroMQ и никаких расширенных функциональных возможностей, кроме самых базовых. Основные модули разделены таким образом, что каждый базовый объект ZeroMQ (или функция, если объект не связан) является отдельным модулем, например, zmq.core.context содержит объект Context,zmq.core.poll содержит объект Poller, а также функцию select() и т. Д. Для удобства все константы ZMQ хранятся вместе в zmq.core.constants.

Существует две причины поломки ядрав подмодули: перекомпиляция и производные проекты. Монолитный PyZMQ стал довольно утомительным, чтобы перекомпилировать все для небольшого изменения в один объект. С отдельными файлами это больше не нужно. Вторая причина связана с Cython. PyZMQ написан на Cython, инструменте для эффективного написания C-расширений для Python. Разделяя наши объекты на отдельные файлы pyx, каждый со своими объявлениями в заголовке pxd, другие проекты могут писать расширения в Cython и напрямую обращаться к ZeroMQ на уровне C без наказания за прохождение наших объектов Python.

Потокобезопасность

В ØMQ контексты являются объектами, обеспечивающими безопасность потоков, а сокеты - нет. Безопасно использовать один Context (например, через zmq.Context.instance()) во всем многопоточном приложении, но вы должны создавать сокеты для каждого потока. Если вы разделяете сокеты между потоками, вы, скорее всего, столкнетесь с неуловимыми c-level сбоями вашего приложения , если только вы не используете разумное применениеthreading.Lock, но такой подход не рекомендуется.

Трудолюбивые гики ZeroMQ уже заметили, что оригинальный ZeroMQAPI (начиная с v2.1.11 +) имеет и другие советы:

1) приложение должно явно создать хотя бы один Context экземпляр (и прекратить его позже)

2) Context -инстанции можно свободно использовать в потоках без любая блокировка, необходимая на стороне вызывающего абонента Context

3) Потоковая безопасность предоставляется даже для передачи (не переноса) Socket -инстанций во вновь созданный поток (т. Е. Поддерживаемый потоком, не принадлежащим "иностранному" - Context), из которого PyZMQдокументация явно предупреждает и отвлекает пользователей от любых действий.

...