2017-09-04 6 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

Pipe은 문제의 해결책이 아닙니다. spawner의 파일 이름을 클리너에 전달하려는 경우 파이프를 사용할 수 있지만 플래그를 올리려고하면됩니다. 이를 위해 Event을 사용하는 것이 좋습니다. https://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'를 보낼 것입니다). cleaner에서는'filename = pipeEnd.recv()'를 사용하고 새로운 이름을 생성하기위한 간단한 텍스트 처리 (dest dir에서)와'copy2 (filename, dest_filename)' – lxop

+0

을 얻습니다. 나는'queue' ('spawner'를 사용하여 큐에 파일을 넣고'queue '가 비워 질 때까지'cleaner'를 사용하여'get'ting)로 끝내려고했습니다. 정말 고마워요! –