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()
을 끝 결코 중단 노동자와 결과 스레드에 일부 종료 신호를 보낼 필요하지만, 위의 코드는 전달 된 각 경로에 대해 하나 개의 서브 프로세스를 생성 in. – jsbueno
no -> 경로가 너무 적은 경우에만 -> 범위 내에서 (0, min (thread_count, len (paths))) – user3691223