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документация явно предупреждает и отвлекает пользователей от любых действий.