Являются ли несколько ASIO io_services хорошей?
Я начал использовать Boost.ASIO для некоторых простых сетевых программ, мое понимание библиотеки не так уж много, поэтому, пожалуйста, несите меня и мой вопрос о новичках.
В настоящий момент в моем проекте у меня есть только объект io_service
. Который используется для всех операций асинхронного ввода-вывода и т.д.
Я понимаю, что можно создать несколько потоков и передать метод run экземпляра io_service
в поток, чтобы предоставить больше потоков для io_service
.
Мой вопрос: хороший дизайн имеет несколько объектов io_service
? например, имеют 2 различных экземпляра io_service
, каждый из которых связан с двумя потоками, как-то они знают друг о друге (и, следовательно, сотрудничают с каждым), или если они не будут отрицательно влиять друг на друга?
Мое намерение состоит в том, чтобы иметь 1 io_service
для ввода-вывода на основе сокетов, а другой для ввода/вывода с последовательным интерфейсом (tty).
Ответы
Ответ 1
Мы используем несколько io_service, потому что некоторые компоненты в нашем приложении должны запускать все свои рабочие потоки по определенным фиксированным приоритетам, разные для каждого компонента. Таким образом, каждому компоненту предоставляется собственный io_service, и каждый компонент имеет свой собственный пул потоков, выполняющий run()
.
Другие проекты, о которых я мог думать, были бы, если для каждого IO требуется другое количество потоков в пуле, или, что более важно для вашего случая, - если пул не может быть общим, потому что, например, если ваша сеть IO может вынуть каждый поток и оставить ваш серийный IO ожидания.
Ответ 2
IIRC, во время Майкл Caisse Boostcon ASIO talk (что стоит посмотреть в любом случае), я считаю, что этот вопрос явно задан участником аудитории и в качестве возможного решения. Я беру от этого, что это не так само по себе, и может использоваться таким образом в соответствии с вашим дизайном.
Ответ 3
Это обсуждение может быть полезным:
http://thread.gmane.org/gmane.comp.lib.boost.asio.user/1300
У меня нет кода здесь, но почему вы используете несколько io_services? Я думал, что он использовал один io_service и несколько потоков, выполняющих запуск что один io_service.
IIUC, каждому io_service принадлежит очередь select/epoll/whatever, поэтому с несколькими io_services сродни наличию нескольких независимых циклов select/epoll. В некоторых ситуации, например. большое количество сокетов и нескольких процессоров, это может помочь.
Что-то я менее уверен в том, что все запущенные несколько потоков io_service:: run (с тем же io_service). Я думаю, это просто означает обработчики запускаются одновременно, в то время как select/epoll/etc. цикл - общий. Я думаю, что это лучше всего, когда ваши обработчики относительно длительные операции.