Каково обоснование контекста zeroMQ?
В то время как poking zeroMQ (очень полезная замена сокетов для тех, кто не знает), я столкнулся с этим вопросом в рассылке списка:
Использование нескольких контекстов: есть ли недостаток в использовании нескольких контекстов?
Есть ли недостаток в использовании нескольких контекстов? У меня есть идентификатор обертки класса, который должен быть как можно более простым. Я могу либо изменить его, чтобы разрешить несколько подключений, сокетов и т.д. В рамках одного контекста, либо оставить его как есть, и клиентские экземпляры этого экземпляра создают несколько экземпляров.
Два недостатка, как я вижу.
- Закрепление ресурсов без хорошего эффекта (дополнительный объем памяти, другой поток ввода-вывода и т.д.)
- Сокеты, созданные в разных контекстах, не могут связываться друг с другом с помощью транспорта inproc. Имя "inproc" немного неверно; это действительно означает "внутриконтекст".
сг
Оглядываясь назад на мой и другой исходный код, я в конце концов понял, что код настройки контекста:
void *context = zmq_init (1); //creates the context
void *responder = zmq_socket (context, ZMQ_REP); //creates the socket
zmq_bind (responder, "tcp://*:5555"); //and binds it
... //Do whatever you want with the socket ...
zmq_close (responder); //destructors
zmq_term (context);
Может быть эффективно заменено на:
void *context = zmq_init(1); //saving the context is optional
responder = zmq_socket(type); //creates the socket
//additional [context] can be provided if desired (multi-context?)
zmq_bind (responder, "tcp://*:5555"); //and binds it
... //Do whatever you want with the socket ...
zmqx_dest(); //destroys the global context, else provide alternative [context]
И что я сделал с макросами. Это облегчает работу с 1 переменной, чтобы отслеживать (среди 100 других). Хотя его далеко не "идеальный", поскольку он требует, чтобы макросы находились в пределах одного и того же "объема функции", хотя это можно было легко решить.
В то время как мой пример - C, это несколько языковой агностик.
Отсюда вопрос: в чем смысл создания таких контекстов?
Когда на самом деле это недостаток, чтобы позволить такую функцию? Причина, по которой я могу легко предвидеть многих (кто просто копирует/вставляет/редактирует код), не учитывает дополнительные накладные расходы и создает "множество контекстов", когда он не нужен [видел это много раз для другой подобной структуры, хотя их существование имеет его собственное оправдание]
Одной из причин, о которых я говорю, является тот факт, что я рассматриваю использование zeroMQ в модуле программирования для начинающих. В значительной степени частично из-за его простоты и того факта, что сокеты, как правило, жарят клетки мозга для новых ребят.
Случайный, я фактически оправдал обоснование контекстной системы Google V8 (аналогичный вопрос, другая система):
Каково обоснование дизайна HandleScope?
Ответы
Ответ 1
Это хороший вопрос. Если вам не нужно сохранять глобальный контекст, почему бы даже попросить приложение создать его? libzmq может тривиально настроить свое состояние при необходимости в первый раз.
Однако проблема с устаревшим API 0MQ заключается не в том, что он заставляет вас использовать контексты, поскольку они являются естественным родительским классом для сокетов. Проблема в том, что, пытаясь создать и отслеживать контексты, вы почти не цените свою работу. Кажется, все затраты и отсутствие выгоды.
Если вы посмотрите на более свежие API, например. CZMQ и 0MQ/3.1 вы увидите, что контексты намного полезнее. В CZMQ мы очищаем и уничтожаем все сокеты при уничтожении контекста. Это действительно полезно. В 0MQ/3.1 мы добавили некоторую конфигурацию контекста, такую как количество потоков ввода-вывода и т.д. Также API более согласован (zmq_ctx_new, zmq_ctx_set/get, zmq_ctx_destroy) с моделью класса (и больше похож на CZMQ).