0

파이썬에서 멀티 프로세싱에 문제가 있습니다. 아래 코드에서는 7 명의 작업자 (다중 처리. 프로세스)와 하나의 결과 threading.Thread를 호출합니다. 데이터의 처리 후 (파일에서 일부 메타 데이터를 추출)하기 전에, 나는 실행파이썬 다중 프로세싱과 너무 많은 파일 열기

lsof | grep ' <user> ' | grep 'python3' 

그리고 일부 열린 핸들을 얻을 :

python3 17291    ivo DEL  REG    0,20    5288943 /dev/shm/ZMcs2H 
python3 17291    ivo DEL  REG    0,20    5288942 /dev/shm/3iMR4q 
python3 17291    ivo DEL  REG    0,20    5288941 /dev/shm/XPYh79 

및 루프에서 여러 번 멀티 프로세싱을 실행하는 경우 (일부를 처리 연속 메시지) 내가 얻을

OSError: [Errno 24] Too many open files 

다중 처리 패키지를 다루는 데 문제가 있습니까?

def worker_process_results(meta_queue, res_dict): 
    while True: 
     try: 
      (path, meta) = meta_queue.get() 
      res_dict[path] = meta 
     finally: 
      meta_queue.task_done() 

def multiprocess_get_metadata(paths, thread_count = 7): 
    """ Scan files for metadata (multiprocessing). """ 
    file_queue = multiprocessing.JoinableQueue() 
    meta_queue = multiprocessing.JoinableQueue() 

    res_dict = dict() 
    # result thread  
    meta_thread = threading.Thread(target = lambda: worker_process_results(meta_queue, res_dict)) 
    meta_thread.daemon = True 
    meta_thread.start() 

    workers = [] 

    for _ in range(0, min(thread_count, len(paths))): 
     worker = MetaDataWorker(file_queue, meta_queue) 
     worker.daemon = True 
     worker.start()   
     workers.append(worker) 

    for path in paths: 
     file_queue.put(path) 

    file_queue.join() 
    meta_queue.join() 

    for x in workers: 
     x.terminate() 

    return res_dict 

class MetaDataWorker(multiprocessing.Process): 
    ''' Use library to get meta data from file. ''' 

    def __init__(self, file_queue, meta_queue): 
     ''' Constructor. ''' 
     super().__init__() 

     self.file_queue = file_queue 
     self.meta_queue = meta_queue 

    def run(self): 
     """ Run. """ 

     while True: 
      try: 
       path = self.file_queue.get() 
       meta = getmetadata(path) 
       meta = None 
       self.meta_queue.put((path, meta)) 
      except Exception as err: 
       print("Thread end.") 
       print("{0}".format(err)) 
      finally: 
       self.file_queue.task_done() 
+0

을 끝 결코 중단 노동자와 결과 스레드에 일부 종료 신호를 보낼 필요하지만, 위의 코드는 전달 된 각 경로에 대해 하나 개의 서브 프로세스를 생성 in. – jsbueno

+0

no -> 경로가 너무 적은 경우에만 -> 범위 내에서 (0, min (thread_count, len (paths))) – user3691223

답변

0

이미 해결, 나는 루프

당신은 "7 명 근로자"에 대해 이야기