Как интегрировать сокет ZeroMQ в основной цикл glib? - PullRequest
3 голосов
/ 14 июля 2011

Я хотел добавить сокет ZeroMQ в программу glib.

Жаль, что сокет zmq не poll() -поддерживается, и они дают свою реализацию, которая перегружает старый poll() функционал.Как я могу эффективно интегрировать это в основной цикл?Я попытался использовать их опрос (zmq_poll()) вместо стандартного, но нет хорошего способа дать ему сокет zmq, кроме как сделать его global.

Определение нового GSource работает, но это может привести к высокой загрузке ЦП (путем установки timeout = 0) или произвольным тайм-аутам опроса (например, установка опроса timeout = 100 как минимум каждые 100 мс), что не очень эффективно, поскольку существует возможность опроса.

Ответы [ 2 ]

1 голос
/ 20 июля 2011

Я обнаружил, что новые библиотеки zmq поддерживают параметр ZMQ_FD getsockopt(), который возвращает вам unix fd, который вы можете poll().Единственное предостережение в том, что вы не можете просто poll() узнать, можете ли вы recv() или send() из / в него, но вам нужно использовать параметр ZMQ_EVENTS getsockopt()чтобы вернуть реальный fd статус.

В glib, похоже, он работает довольно хорошо.

1 голос
/ 16 июля 2011

Согласно FAQ вы можете попробовать "другой путь". Вместо создания poll на сокете zmq попробуйте zmq_poll() на обычном сокете .

Проверьте вопрос Как интегрировать гнезда ØMQ с обычными гнездами? Или с циклом событий GUI? в FAQ.

...