2014-10-11 3 views
0

here이라는 질문이 있는데 해결되었습니다.Python에서 스레딩 가능 클래스를 동적으로로드하는 중

나의 새로운 질문 dynmaically하여 디렉토리에있는 모듈로드를 통해 반복 할 마지막에 코드를 함께 할 수있다 : 나는 웹 사이트에서 PDF를 읽는하고있는 대부분의 클래스에서

modules = pkgutil.iter_modules(path=[os.path.join(path,'scrapers')]) 
for loader, mod_name, ispkg in modules: 
    # Ensure that module isn't already loaded, and that it isn't the parent class 
    if (mod_name not in sys.modules) and (mod_name != "Scrape_BASE"): 
     # Import module 
     loaded_mod = __import__('scrapers.'+mod_name, fromlist=[mod_name]) 
     # Load class from imported module. Make sure the module and the class are named the same 
     class_name = mod_name 
     loaded_class = getattr(loaded_mod, class_name) 
     # only instantiate subclasses of Scrape_BASE 
     if(issubclass(loaded_class,Scrape_BASE.Scrape_BASE)): 
      # Create an instance of the class and run it 
      instance = loaded_class() 
      instance.start() 
      instance.join() 
      text = instance.GetText() 

, 내용을 스크랩하고 GetText()에 의해 연속적으로 반환되는 텍스트를 설정합니다.

경우에 따라 PDF가 너무 커서 최종적으로 세그멘테이션 오류가 발생합니다. 스레드를 모니터링하여 3 분 정도 후에 스레드가 시간 초과되도록하는 방법이 있습니까? 누구든지이 구현하는 방법에 대한 제안이 있습니까?

답변

0

오른쪽이 방법은 우리에게 표시되지 않은 클래스의 코드를 변경하여 영원히 실행되지 않도록하는 것입니다. 그게 가능하다면 분명히 그렇게해야합니다. 그리고 시간을 초과하려는 경우 "웹 사이트에서 PDF 읽기"가 거의 가능합니다.

하지만 가끔은, 그것은 가능하지 않다; 때로는 예를 들어 시간 초과가없는 C 함수를 호출하는 것입니다. 그래서, 당신은 그것에 대해 무엇을합니까?

음, 스레드가 중단 될 수 없다. 따라서 프로세스를 대신 사용해야합니다. multiprocessing.Process은 동일한 프로세스의 스레드 대신 자식 프로세스에서 코드를 실행한다는 점을 제외하고는 threading.Thread과 매우 비슷합니다.

이것은 명시 적으로 처리하지 않고 모든 글로벌 데이터를 공유 할 수는 없지만 일반적으로 건입니다. 그러나 입력 데이터 (이 경우 아무것도 아닌 것 같습니다)와 출력 (큰 문자열 인 것처럼 보임)은 picklable이어야하고 큐를 통해 명시 적으로 전달되어야합니다. 이것은 매우 쉽게 할 수 있습니다. 자세한 내용은 Exchanging objects between processes 섹션을 읽어보십시오.

우리는 그것을 생각하면서 디자인 대신에 스레드 대신 작업을 생각해 보는 것이 좋습니다. 다운로드 할 200 개의 PDF가 있다면 200 개의 스레드가 실제로 필요하지는 않습니다. 어쩌면 8 개 또는 12 개의 스레드가 필요하며 모두 200 개의 작업 큐를 처리합니다. multiprocessing 모듈은 프로세스 풀에 대한 지원을 가지고 있지만 이에 적합하도록 concurrent.futures을 찾을 수 있습니다. multiprocessing.Poolconcurrent.futures.ProcessPoolExecutor 둘 다 함수 및 일부 인수를 전달한 다음 일정 또는 대기열 또는 다른 것에 대해 걱정할 필요없이 결과를 기다릴 수 있습니다.

+0

많은 멋진 아이디어가 여기에 있습니다. 나는 그들이 나를 도울 수 있는지 살펴볼 것이다. –

관련 문제