2017-12-20 30 views
0

파이썬은 3동시 데이터 로더를위한 깨끗하고 비단뱀적인 방법?

나는 정말 깨끗하고, 파이썬 동시 데이터 로더가 어떠해야하는지 알고 싶습니다. 메모리에 완전히 들어 맞기에는 너무 큰 데이터에 대해 무거운 계산을하는 내 프로젝트에이 방법이 필요합니다. 따라서 동시에 실행해야하는 데이터 로더를 구현하고 대기열에 데이터를 저장하므로 다음 프로세스가 (다음에로드되는 동안) &을 준비하는 동안 작업 할 수 있습니다. 물론 대기열은 비어있을 때 차단해야합니다 (기본 프로세스는 더 많은 항목을 소비하려고 시도합니다 - 대기열은 새 데이터를 기다려야 함) 또는 전체 (작업자 프로세스는 주 프로세스가 대기열에서 데이터를 소비하여 대기 상태가되지 않도록 대기해야합니다. 메모리 오류).

파이썬의 multiprocessing 모듈 (multiprocessing.Queuemultiprocessing.Process)을 사용하여이 필요를 충족시키는 클래스를 작성했습니다. 클래스의 중요한 부분은 다음과 같이 구현됩니다.

클래스에는 몇 가지 메소드가 있지만 "편의 기능"을위한 클래스입니다. 예를 들어, 각 파일의로드 빈도, 전체 데이터 세트의로드 빈도 등을 계산하지만, Python에서 구현하기가 쉽고 계산 시간을 많이 낭비하지 않습니다 (세트, dicts, ..).).

데이터 부분 자체는 I/O 및 사전 처리로 인해 몇 초가 걸릴 수도 있습니다. 그것이 제가 동시에 일어나는 이유입니다.

ConcurrentLoader해야 : get_batch_data 호출하지만, 큐가 비어있는 경우

  • 블록 작업자 프로세스 :

    • 블록의 주요 과정은 대기열이 꽉 찬 경우, 메모리 부족 오류를 방지하고에서 while True을 방지하기 위해 리소스 낭비
    • ConcurrentLoader을 사용하는 모든 클래스에 "투명"해야합니다. 실제로 데이터 경로를 제공하고 get_batch_data을 실제로 사용하지 않고 ("간편한 사용")
    • 주요 프로세스가 다시

    이러한 목표를 (난 아무것도 잊어 버린?) 나는 현재 구현을 향상시키기 위해 무엇을해야하는지 고려 자원을 확보하기 위해 죽을 때

  • 는 노동자를 종료? 스레드/데드락이 안전합니까? 더 "파이썬적인"구현 방법이 있습니까? 좀 더 깨끗하게 할 수 있을까요? 어떻게 든 자원을 낭비합니까? ConcurrentLoader 대략이 설정을 따를 것입니다 사용

    모든 클래스 :

    class Foo: 
        ... 
    
        def do_something(self): 
         ... 
         data1 = ConcurrentLoader("path/to/data1", 64, 8) 
         data2 = ConcurrentLoader("path/to/data2", 256, 16) 
         ... 
         sample1 = data1.get_batch_data() 
         sample2 = data2.get_batch_data() 
         ... # heavy computations with data contained in 'sample1' & 'sample2' 
          # go *here* 
    

    는 자신의, 청소기, 더 파이썬 접근 방식을 내 접근 방식을 개선하거나 공급하기 위해 어떤 종류의 실수를 지적 해주십시오 중 하나. multiprocessing.Queue이/빈 완전하고 자동의 발생에 get()/put()가 호출 될 때 차단

  • 답변

    1
    • .

    • 이 동작은 호출하는 함수에 투명합니다.주요 프로세스가

    를 종료 할 때

  • 사용 self._worker.daemon = Trueself._worker.start() 전에이 때문에 작업자 (들)이 자동으로 살해됩니다