मैं एक अभ्यास के रूप में मल्टीप्रोसेसिंग का उपयोग करके फाइलों की प्रतिलिपि बनाने के लिए अपनी स्क्रिप्ट को संशोधित करने की कोशिश कर रहा हूं, मेरे लिए पाइथन में मल्टीप्रोसेसिंग के बारे में और जानें

मेरा मुख्य यह करता है

if __name__ == "__main__":
    #get command line arguments
    cmdlineArgs = getCmdLineArguments()
    #get all the files in folder
    listOfFiles = getFiles(cmdlineArgs.sourceDirectory)
    #create dataframe of files which needs to be copied
    filesDF = createDF(listOfFiles, cmdlineArgs.destDirectory)
    processes = []
    lstOfDates = list(set(filesDF['date'].to_list()))
    lstOfDates.sort()
    # for dt in lstOfDates:
    #     copyFilesAcross([filesDF, [dt]])
    splitListOfDatesForProc = [(lstOfDates[i:i+3]) for i in range(0, len(lstOfDates), 3)]
    for dt in splitListOfDatesForProc:
        p = Process(target=copyFilesAcross, args=([filesDF, dt],))
        processes.append(p)
        p.start()

    for p in processes:
        p.join()

CopyFilesAcross यह करता है:

def copyFilesAcross(lst):
    #keep only the date provided as parameter
    df = lst[0]
    dt = lst[1]
    for d in dt:
        df = df[df.date == d]
        print("Processing date " + d + ' for PID: ', os.getpid())
        for index,row in df.iterrows():
            try:
                #print('Making directory ' + row['destination'])
                os.makedirs(row['destination'], exist_ok=True)
                shutil.copy(row['source'], row['destination'])
            except OSError as e:
                print('Failed to copy file ' + row['source'] + ' with error {0}'.format(e) )
            except:
                print("Unexpected error: ", sys.exc_info()[0])

आउटपुट:

getFiles: Executed ...
getFiles: Creating empty list ...
getFiles: Concatenating files ...
Creating dataframe of files to be copied ...
Creating empty dataframe ...
Populating dataframe ...
Sorting data frame by date ...
Processing date 20180204 for PID:  35033 <- processed
Processing date 20180304 for PID:  35034 <- processed
Processing date 20180811 for PID:  35038 <- processed
Processing date 20180815 for PID:  35041 <- processed
Processing date 20180311 for PID:  35034 <- not processed
Processing date 20180724 for PID:  35034 <- not processed
Processing date 20180222 for PID:  35033 <- not processed
Processing date 20180303 for PID:  35033 <- not processed
Processing date 20180812 for PID:  35038 <- not processed
Processing date 20180813 for PID:  35038 <- not processed

Process finished with exit code 0

मल्टीप्रोसेसिंग के बिना स्क्रिप्ट ठीक चलती है इसलिए मुझे लगता है कि समस्या मुख्य रूप से लूप के लिए अंतिम 2 में है, लेकिन मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं।

0
user91991993 5 फरवरी 2021, 05:02

1 उत्तर

सबसे बढ़िया उत्तर

यह वास्तव में एक मल्टीप्रोसेसिंग समस्या नहीं है, आपके कोड में बस एक बग है।

copyFilesAcross में पहले लूप पुनरावृत्ति पर, आप df को अधिलेखित कर देते हैं, और dt में पहली तारीख से मेल खाने वाली लाइन के अलावा हर लाइन को फेंक देते हैं। for d in dt: के अगले (और बाद के सभी) पुनरावृत्ति पर, आप एक अलग तिथि खोजने का प्रयास करते हैं जो मौजूद नहीं होगा, और फिर आप df को एक खाली डेटाफ़्रेम के साथ अधिलेखित कर देते हैं। जब आप for index,row in df.iterrows(): को कॉल करते हैं, तो कोई पंक्तियाँ नहीं होती हैं, इसलिए लूप कभी भी निष्पादित नहीं होता है।

1
Aaron 5 फरवरी 2021, 07:35