2017-09-04 55 views
1

我想熟悉multiprocessing模塊。我目前在Pipe()有一些問題。我設計了一個小例子來說明我的問題。多處理管道()不工作

我寫了兩個功能:

  • 檢測這些文件並將它們複製到另一個文件夾(cleaner

之一,在一個特定的文件夾(spawner

  • 創建文件和另一他們都很好。我還設法創建了Process,以便同時創建和複製文件。

    對於下一步,我希望spawnercleaner通信,它已完成創建文件以便後者可以終止。

    下面是代碼:

    import os 
    from time import sleep 
    import multiprocessing as mp 
    from shutil import copy2 
    
    
    def spawner(f_folder, pipeEnd): 
        template = 'my_file{}.txt' 
        for i in range(10): 
         new_file = os.path.join(f_folder, template.format(str(i))) 
         with open(new_file, 'w'): 
          pass 
         sleep(1) 
        pipeEnd.send(True) 
        return 
    
    
    def cleaner(f_folder, t_folder, pipeEnd): 
        state = set() 
        while not pipeEnd.recv(): 
         new_files = set(os.listdir(f_folder)).difference(state) 
         state = set(os.listdir(f_folder)) 
         for file in new_files: 
          copy2(os.path.join(f_folder, file), t_folder) 
         sleep(3) 
        return 
    
    if __name__ == '__main__': 
        receiver, sender = mp.Pipe() 
        from_folder = r'C:\Users\evkouni\Desktop\TEMP\PythonTests\subProcess\from' 
        to_folder = r'C:\Users\evkouni\Desktop\TEMP\PythonTests\subProcess\to' 
        p = mp.Process(target=spawner, args=(from_folder, sender)) 
        q = mp.Process(target=cleaner, args=(from_folder, to_folder, receiver)) 
        p.start() 
        q.start() 
    

    我似乎沒有能夠得到它的工作..任何幫助,將不勝感激。

  • 回答

    2

    A Pipe是您的問題的錯誤解決方案。如果你想從spawner傳遞文件名到清理器,你可以使用管道,但是你要做的是提高一個標誌。爲此,我建議使用一個Eventhttps://docs.python.org/2/library/multiprocessing.html#multiprocessing.Event

    這可以被認爲是一個線程安全(和多進程安全)布爾值。你會用它像

    finished = mp.Event() 
    ... 
    finished.set() # pipeEnd.send(True) 
    ... 
    while not finished.is_set(): # while not receiver.recv(): 
    
    +0

    非常感謝答案。它確實有效,或多或少。你是否介意張貼'Pipe()'解決方案,並假設我想傳遞文件名? –

    +0

    在這種情況下,你將在spawner中有'pipeEnd.send(new_file)'(可能在完成時發送'None'或'False')。在清理程序中,您將擁有'filename = pipeEnd.recv()',然後執行一些簡單的文本處理來生成新名稱(在dest目錄中)和'copy2(filename,dest_filename)' – lxop

    +0

    明白了。我用'queue'完成了這個工作(''用'spawner'將隊列中的文件放入隊列中''用'clean'將它們'取代',直到'queue'爲空。)非常感謝! –