Один io-thread, несколько worker-thread

В одно время всё никак не мог придумат как красиво реализовать модель с одним io-thread, который принимает запросы и множеством worker-thread которые их обрабатывают. Зачем такая схема? Потому что в многотредовом приложении только один тред может обрабатывать события (epoll, kqueue и т.п.). Но однотредовое приложение не будет использовать все ресурсы современного многоядерного процессора.

Спасибо anight, не в первый раз он меня выручает, за идею.

Идею я реализовал и снова порадовался её красоте. Решил не держать в закромах реализацию идеи, а поделиться ею.

Дла начала скачайте ioworker-0.0.2.tar.gz.

Пример кода сильно порезан чтобы не создавать лишнюю путаницу. Для меня там всё кажется очевидным :), но кратко поясню код…

Всё что делает программа — это приём запросов на заданном порту (-p или 8000 по-умолчанию), при этом вызывается request_read_cb который ищет в запросе \n и, если находит, вызывает worker_add_task или продолжает ждать пока не придёт \n. worker_add_task последовательно перебирает все воркеры и пытается каждому из них скормить ссылку на соединение (conn_t). Если получилось, данное соединение маркируется как используемое (c->used = 1) и цикл прерывается. Если не получилось, на соединение с воркером вешается EV_WRITE (помимо того что там постоянно висит EV_READ). Когда приходит EV_WRITE (на все события по соединению с воркерами вызывается worker_cb) мы снова пытаемся скормить воркеру ссылку на соединение. В это время воркер (worker_loop) ждёт данные от io-thread. Ждёт он их на блокирующем сокете. Как только приходят данные (ссылка на соединение), в соединение пишутся ответные данные (идентификатор воркера и количество запросов к этому воркеру) и отсылаем ссылку на обработанное соединение обратно в io-thread. io-thread принимает это соединение (worker_cb) и отсылает ответ за запрос клиенту.

Вот такая вот штука. Буду рад если этот код кому-нить поможет.

Да, в программе используется libevent.

Удачи.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Tags:

Ответь!

CAPTCHA image

можно использовать: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>