К сожалению, это не так просто. Да, они обе используют poll(), но проблема в том, что только одна библиотека будет вызывать poll() в каждый момент времени, и только эта библиотека фактически будет получать какие-либо события, а другая застревает. Это классическая проблема с библиотеками циклов событий — по умолчанию их нельзя использовать вместе.
Один из вариантов — попытаться использовать библиотеки в отдельных потоках. Но часто библиотеки, управляемые событиями, разрабатываются исходя из предположения, что вы делаете все в одном потоке, потому что иначе зачем вам нужен цикл обработки событий?
Но «Правильно» — интегрировать циклы событий. Цикл событий KJ можно интегрировать с другими библиотеками событий. Например, я интегрировал его с libuv для node-capnp; см. первую часть этого файла:
https://github.com/kentonv/node-capnp/blob/master/src/node-capnp/capnp.cc
(В какой-то момент я планирую выделить код, связанный с libuv, в отдельную библиотеку, поставляемую с Cap'n Proto.)
В качестве другого примера, вот запрос на вытягивание от Натана Хурта, чтобы добавить интеграцию с циклом событий Qt, но обратите внимание, что этот запрос не включает интеграцию ввода-вывода, я думаю, потому что Натан использует реализацию AsyncIoStream
, в которую он вручную помещает данные когда это доступно:
https://github.com/sandstorm-io/capnproto/pull/253
В любом случае вам нужно будет сделать что-то подобное с тем, что использует Kafka. Надеюсь, вы вернете свой код обратно в Cap'n Proto! :)
person
Kenton Varda
schedule
15.10.2015