параллелизм данных через многопоточность, вызов утилиты в каждом потоке для обработки файла - PullRequest
0 голосов
/ 25 июня 2018

В настоящее время я работаю над проектом, в котором я получаю запрос со списком файлов для обработки (например, программа QueueHandler). В настоящее время я обрабатываю файлы в последовательном порядке, вызывая другую служебную программу (например, FileProcessor), где Фактический алгоритм присутствует. QueueHandler вызывает FileProcessor с помощью вызова system () в цикле.

Я планирую реализовать многопоточность, чтобы можно было обрабатывать несколько файлов одновременно, каждый файл не зависит друг от друга, как только обработка выполняется FileProcessor, QueueHandler проверяет, был ли результат сгенерирован успешно, а затем отправляет обратно комбинированный отчет. назад.

Для иллюстрации я написал пример программы, которая имитирует поведение моей настоящей программы и записывает определенное количество целых чисел в файл (FileProcessor aka myPrinterUtility), а другая программа вызывает эту служебную программу с другими аргументами (QueueHandler, также называемый main. CPP)

Вопрос 1 - Есть ли лучший способ для реализации того же, я хотел бы сохранить QueueHandler и FileProcessor как отдельные программы.

Вопрос 2 - hardware_concurrency () noexcept; показать вывод как 4, но мне может понадобиться обрабатывать до 12 файлов за раз (текущий верхний предел), как это повлияет на скорость, если я открою одновременно 12 потоков против 4 потоков одновременно (какой из них лучше).

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

main.cpp

#include<iostream>
#include<thread>
#include<future>
#include<stdlib.h>
#include<fstream>
#include<vector>
using namespace std;



bool is_file_exist(const char *fileName)
{
    std::ifstream infile(fileName);
    infile.seekg(0, ios::end);
    bool retVal=infile.good() && (infile.tellg()>0);
    bool fileExist=infile.good();
    infile.close();
    if(!fileExist)
    {
        return false;
    }
    else
    {
        return true;
    }
}


bool CallUtil(int firstNumber,int totalNumbersToPrint,int fileName)
{
    //call the utility program
    string opFile="/home/saumitra/sampleOP/output-"+std::to_string(fileName)+".txt";
    string utilString="/home/saumitra/myPrinterUtility "+std::to_string(firstNumber)+ " " +std::to_string(totalNumbersToPrint)+" "+opFile;

    system(utilString.c_str());
    return is_file_exist(opFile.c_str());
}

int main()
{
    vector<std::future<bool> > myFutureVector;
    for(int first=100,total=1000,i=0;i<5;i++,first=first+100,total=total+5000)
    {
        myFutureVector.push_back(std::async(launch::async,CallUtil,first,total,i));
    }

    for(vector<std::future<bool> >::iterator it=myFutureVector.begin();it!=myFutureVector.end();it++)
    {
        cout<<"final status : "<<it->get()<<endl;
    }
    return 0;
}

myPrinterUtility.cpp

#include<fstream>
#include<string>

using namespace std;

int main(int argc,char* argv[])
{
    if(argc==4)
    {

        string firstNum=argv[1];
        string total=argv[2];
        string filename=argv[3];

        ofstream filelist;
        filelist.open(filename.c_str(),ios::app);

        int firstNumInt=stoi(firstNum);
        int totalInt=stoi(total);

        for(int i=0;i<totalInt;i++)
        {
            filelist<<i+firstNumInt<<endl;
        }
        filelist.close();
    }

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