Я читал о шаблоне пула потоков, и я не могу найти обычное решение для следующей проблемы.
Я иногда хочу, чтобы задачи выполнялись последовательно. Например, я читаю фрагменты текста из файла и по какой-то причине мне нужны куски, которые будут обрабатываться в этом порядке. Поэтому в основном я хочу исключить concurrency для некоторых задач.
Рассмотрим этот сценарий, в котором задачи с *
должны обрабатываться в том порядке, в котором они были введены. Другие задачи могут обрабатываться в любом порядке.
push task1
push task2
push task3 *
push task4 *
push task5
push task6 *
....
and so on
В контексте пула потоков, без этого ограничения, одна очередь ожидающих задач работает нормально, но явно здесь нет.
Я думал о том, что некоторые потоки работают в очереди с конкретным потоком, а остальные - в "глобальной" очереди. Затем, чтобы последовательно выполнять некоторые из задач, мне просто нужно вытолкнуть их в очередь, где выглядит один поток. Это звучит немного неуклюже.
Итак, настоящий вопрос в этой длинной истории: как бы вы это решили? Как бы вы гарантировали выполнение этих задач?
ИЗМЕНИТЬ
Как более общая проблема, предположим, что вышеприведенный сценарий становится
push task1
push task2 **
push task3 *
push task4 *
push task5
push task6 *
push task7 **
push task8 *
push task9
....
and so on
Я имею в виду, что задачи внутри группы должны выполняться последовательно, но сами группы могут смешиваться. Таким образом, вы можете иметь 3-2-5-4-7
, например.
Еще одна вещь, которую нужно отметить, это то, что у меня нет доступа ко всем задачам в группе upfront (и я не могу дождаться, пока все они появятся до начала группы).
Спасибо за ваше время.