C ++ система паузы / возобновления при большой работе - PullRequest
0 голосов
/ 18 января 2019

У меня есть программа на C ++, которая загружает файл с несколькими миллионами строк и начинает обработку, ту же операцию выполнял скрипт php, но чтобы сократить время выполнения, я переключился на C ++.

В старом скрипте я проверил, есть ли файл с текущим идентификатором операции в папке "pause", файл пуст. Просто для проверки, запрашивается ли пауза, скрипт проверяет после каждых 5 итераций если есть такой файл, если так, он застрял в пустом цикле, пока файл не будет удален (иначе резюме):

foreach($lines as $line)
    {
        $isFinished = $index >= $countData - 1;
        if($index % 5 == 0)
        {
            do
            {
                $isPaused = file_exists("/home/pauses/".$content->{'drop-id'});
            }while($isPaused);
        }
        // Starts processing the line here 
}

Но поскольку доступ к диску относительно медленный, я не хочу использовать тот же подход, поэтому я подумал о каких-то командах, которые имитируют это:

$ kill cpp_program // C++ program returns the last index checked e.g: 37710
$ ./main 37710
$ // cpp_program escapes the first 37709 lines and continues its job

Что вы думаете об этом подходе? Это возможно? Это не занимает много времени? Есть ли лучший подход? Спасибо

Edit: пояснение, потому что это кажется немного двусмысленным, эта задача выполняется в фоновом режиме, есть другое приложение, которое запускает это, я хочу иметь возможность отправить команду из приложения управления (через команды Linux) в фоновый режим задание приостановить / возобновить.

1 Ответ

0 голосов
/ 18 января 2019

Для перехода к строке 37710 текстового файла, к сожалению, требуется прочитать все строки 37710 перед этим в большинстве операционных систем.

В большинстве операционных систем текстовые файлы представляют собой двоичные файлы с соглашением о переводе строк. Но ОС не кеширует, где находятся новые строки.

Итак, чтобы найти новые строки, вы должны прочитать каждый байт.

Если ваша программа сохранила смещение байта файла, который она достигла, она может найти это место.

Вы можете сохранить состояние вашей программы в каком-либо файле конфигурации во время завершения работы и установить его возобновление по умолчанию при повторном запуске. Для этого потребуется перехватить сигнал, который вы используете для выключения, сделать так, чтобы ваша основная логика заметила установленный флаг сигнала, а затем аккуратно завершить работу. Это очень C-esque операция.


Теперь другой традиционный способ сделать программу управляемой удаленно - это прослушивать порт TCP (и / или stdin) и принимать там команды командной строки.

Чтобы пойти по этому пути, вы должны написать компонент REPL , а затем подключить его к любому вводу и выводу.

Либо вы выполняете REPL в сопрограммном порядке между процессами обработки файлов, либо вы создаете отдельный поток для выполнения REPL, и он асинхронно связывается с потоком обработки.

Однако, это может быть за пределами вашего мастерства. Каждый шаг этого (написание системы REPL, когда она не блокирует основную работу, отвечает на команды, а затем подключает ее к порту TCP) потребует некоторых усилий и обучения с вашей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...