Одновременная обработка запросов без создания тредов
От: Аноним  
Дата: 30.07.11 07:23
Оценка:
Здравствуйте, всем доброго времени суток.
Предположим, в программе имеются некоторые объекты, для которых необходимо обрабатывать запросы. Обработка таких запросов может идти одновременно( но только для разных объектов, если повторный запрос приходит на объект, который находится в состоянии обработки он обязан его проигнорировать ). Очевидным является подход, когда для каждого такого запроса мы заводим отдельный трэд.(т.е. каждому объекту будет соответствовать "свой" тред) А можно ли в этой ситуации вообще обойтись без лишних тредов и обрабатывать все объекты(точнее запросы с ними связанные) в одной нити? Подскажите как можно реализовать такую концепцию на C?

Небольшие пояснения: В контексте этого сообщения объекты — это обычные структуры(вернее их экземпляры), содержащие некоторые данные. Создание и инициализация таких объектов выполняется кастомером( во время инициализации он специфицирует поведение объектов на различные типы запросов, задавая соответствующие колбэки, т.е. обработка запросов в общем случае сводится к вызовам кастомерских колбэков)


Конечно, можно создать список, в котором будут храниться данные для актуальных запросов и в отдельном треде последовательно в цикле "проходить" по всем элементам списка, вызывая соответствующие колбеки, время обработки запроса можно ограничить с помощью таймера и прерывать выполнение запроса по таймауту, перейти к выполнению следущего элемента по списку, удаляя завершённые запросы из списка. Вот только неясно, как можно продолжить в таком случае выполнение прерванной таким образом функции с того места, где она "прервалась".( если это можно вообще в данной реализации )
Re: Одновременная обработка запросов без создания тредов
От: okman Беларусь https://searchinform.ru/
Дата: 30.07.11 10:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, всем доброго времени суток.

А>Предположим, в программе имеются некоторые объекты, для которых необходимо обрабатывать запросы. Обработка таких запросов может идти одновременно( но только для разных объектов, если повторный запрос приходит на объект, который находится в состоянии обработки он обязан его проигнорировать ). Очевидным является подход, когда для каждого такого запроса мы заводим отдельный трэд.(т.е. каждому объекту будет соответствовать "свой" тред) А можно ли в этой ситуации вообще обойтись без лишних тредов и обрабатывать все объекты(точнее запросы с ними связанные) в одной нити? Подскажите как можно реализовать такую концепцию на C?

А>...


В Windows есть I/O Completion Ports, например (здесь).
Предназначено специально для таких задач.
Re[2]: Одновременная обработка запросов без создания тредов
От: Lavik  
Дата: 01.08.11 04:56
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, всем доброго времени суток.

А>>Предположим, в программе имеются некоторые объекты, для которых необходимо обрабатывать запросы. Обработка таких запросов может идти одновременно( но только для разных объектов, если повторный запрос приходит на объект, который находится в состоянии обработки он обязан его проигнорировать ). Очевидным является подход, когда для каждого такого запроса мы заводим отдельный трэд.(т.е. каждому объекту будет соответствовать "свой" тред) А можно ли в этой ситуации вообще обойтись без лишних тредов и обрабатывать все объекты(точнее запросы с ними связанные) в одной нити? Подскажите как можно реализовать такую концепцию на C?

А>>...


O>В Windows есть I/O Completion Ports, например (здесь).

O>Предназначено специально для таких задач.
Re[2]: Одновременная обработка запросов без создания тредов
От: Lavik  
Дата: 01.08.11 06:00
Оценка:
Здравствуйте, okman, Вы писали:

А>>...


O>В Windows есть I/O Completion Ports, например (здесь).

O>Предназначено специально для таких задач.

Спасибо за ответ, okman.
Возможно, то что вы предлагаете — это хорошое решение, но что делать если вы не используете Windows? хотелось бы узнать как решаются подобные задачи в общем случае, без привязки к конкретным OC.

К слову, I/O Completeon Ports, неявно использует пул трэдов, а хотелось бы, чтобы обработка всех запросов выполнялась в одном трэде.
Re[3]: Одновременная обработка запросов без создания тредов
От: sts  
Дата: 01.08.11 09:24
Оценка: 6 (2)
Здравствуйте, Lavik, Вы писали:

L>Здравствуйте, okman, Вы писали:


А>>>...


O>>В Windows есть I/O Completion Ports, например (здесь).

O>>Предназначено специально для таких задач.

L>Спасибо за ответ, okman.

L>Возможно, то что вы предлагаете — это хорошое решение, но что делать если вы не используете Windows? хотелось бы узнать как решаются подобные задачи в общем случае, без привязки к конкретным OC.

L>К слову, I/O Completeon Ports, неявно использует пул трэдов, а хотелось бы, чтобы обработка всех запросов выполнялась в одном трэде.


Паттерн называется реактор.

Эффективные решения обычно зависят от платформы.
В линуксе это epoll, в BSD — kqueue, в Windows, как уже сказали, completeon ports.
На C стоит использовать какую-нибудь обертку.
Наиболее легковесными и вроде как популярными являются libevents и более новая libev.
Для с++ это наверное boost.Asio

Если эффективность не столь важна, то можно использовать select или poll.
Указанные либы впрочем и это умеют.
Re[4]: Одновременная обработка запросов без создания тредов
От: sts  
Дата: 01.08.11 09:33
Оценка:
И еще.
Если программа не завязана на ввод-вывод, а нужно просто что-то делать параллельно безотносительно системных событий, то можно использовать таймеры.
Т.е. взводим несколько таймеров (по числу задач) с нулевым ожиданием а в обработчике таймера — сначала читаем контекст (значения переменных), выполняем некоторую небольшую порцию полезных действий, потом сохраняем свой контекст. Далее, если задача не завершена, снова взводим таймер задачи, после чего отдаем управление.
Срабатывает следующий таймер и т.д.
Получаем кооперативную многозадачность.
Привет, windows 3.1


Здравствуйте, sts, Вы писали:

sts>Здравствуйте, Lavik, Вы писали:


L>>Здравствуйте, okman, Вы писали:


А>>>>...


O>>>В Windows есть I/O Completion Ports, например (здесь).

O>>>Предназначено специально для таких задач.

L>>Спасибо за ответ, okman.

L>>Возможно, то что вы предлагаете — это хорошое решение, но что делать если вы не используете Windows? хотелось бы узнать как решаются подобные задачи в общем случае, без привязки к конкретным OC.

L>>К слову, I/O Completeon Ports, неявно использует пул трэдов, а хотелось бы, чтобы обработка всех запросов выполнялась в одном трэде.


sts>Паттерн называется реактор.


sts>Эффективные решения обычно зависят от платформы.

sts>В линуксе это epoll, в BSD — kqueue, в Windows, как уже сказали, completeon ports.
sts>На C стоит использовать какую-нибудь обертку.
sts>Наиболее легковесными и вроде как популярными являются libevents и более новая libev.
sts>Для с++ это наверное boost.Asio

sts>Если эффективность не столь важна, то можно использовать select или poll.

sts>Указанные либы впрочем и это умеют.
Re: Одновременная обработка запросов без создания тредов
От: enji  
Дата: 02.08.11 04:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот только неясно, как можно продолжить в таком случае выполнение прерванной таким образом функции с того места, где она "прервалась".( если это можно вообще в данной реализации )


http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.