파비의 매일매일 공부기록

파이썬 동시성 프로그래밍 - #7 실행자와 풀 본문

Study/Python

파이썬 동시성 프로그래밍 - #7 실행자와 풀

fabichoi 2021. 8. 14. 23:30

이번장은 실행자와 풀에 대한 내용이다.

풀이라는 개념은 Java 사용할 때 많이 봤던 거 같은데.. 같은 개념인지는 잘 모르겠다.

또한 이번장은 프로그램의 실행 속도를 높이고자 파이썬에서 구현하는 방법을 소개할 예정이다.

 

동시성 퓨처 : 파이썬 3.2에 새로 추가된 기능. 자바의 ThreadPoolExecutor를 파이썬으로 구현한 형태. 멀티스레드 작업 시 가장 많은 연산을 필요로 하는 작업은 스레드를 시작하는 작업이다. ThreadPoolExecutor는 스레드 풀이 필요할 동안 이를 생성함으로써 문제를 다룸. 사용자는 더 이상 스레드를 생성하거나 실행할 필요가 없고 한 번만 스레드를 생성해 새로운 작업에 기여할 수 있다. 여러 개의 스레드를 한 번에 불러와 실행되는 동안 다양한 작업이 이뤄지기 전에 스레드를 생성하는 일을 한 번만 함.

- Executor 객체 : concurrent.futures 모듈에 있으며 동시성 형태로 여러 가지 호출 지원. 자체적인 객체 및 콘텍스트 관리자 같은 방법으로 사용되며 스레드 생성/시작/조인 같은 지루한 작업을 가독성 높은 코드로 바꾸는 작업을 함.

- 퓨처 객체 : 실행자에 작업을 전달할 때 인스턴스 화가 됨. 주어진 값이 이후에 값이 되는 객체.

- 퓨처 객체의 단위 테스트 : concurrent.futures에서 지원. set_running_or_notify_cancel, set_result, set_exception 메서드 등으로 테스트 가능.

- 호출 가능한 작업 취소 : 시스템에서 실행자 객체로부터 처리되기 전 어떤 작업을 취소하고자 할 때. cancel 한수를 호출하는데 취소가 되었으면 True, 안되었으면 False 반환

- 결과 얻어내기 : 일반적으로 몇몇 상황에서는 실행자 객체의 작업을 취소하거나 모를 수도 있으며, 반환 값을 생각하지 않을 수 있지만, 결과를 검색하고 저장하기 위한 방법이 존재. executor.map 함수를 활용하면 됨.

- as_completed 사용 : 모든 퓨처 객체를 저장해야 하는 상황일 때 사용 가능.

- 콜백 설정 : 작업 요청을 보내고 다른 일을 하는 등 잊고 있다가, 요청된 작업이 완료되었을 때 다시 호출에 사용되는 것을 의미. 

- 예외 클래스 : 이전에 자식 스레드에서 그 밖의 스레드로 예외를 전달하고자 큐를 사용했었는데, 퓨처 객체에서 결과를 검색하는 방법과 동일하게 예외도 반환 가능.

 

ProcessPoolExecutor : 기본적으로 ThreadPoolExecutor와 동일한 기능으로 사용됨. Executor 클래스의 하위 클래스이므로 많은 메서드가 공통이다. 이후의 내용은 ProcessPoolExecutor 모듈의 사용법에 대한 소개다. ProcessPoolExecutor 생성, 콘텍스트 관리자, 연습 및 연산속도 높이기 등이다.

 

웹 크롤러 성능 높이기

- 계획하기 : 기존의 웹 크롤러의 성능을 어떻게 높일지 살펴본다. ThreadPoolExecutor를 사용해 코드를 리펙토링 하고 CSV나 JSON 파일 포맷으로 크롤링 결과 출력하고, 크롤링하는 모든 페이지 및 각 정보를 저장해 데이터를 활용한 사이트 성능을 높이는 순으로 진행한다.

 

익숙하면서 익숙하지 않은 기술에 대한 내용이었다.

예제들이 많아서 하나씩 해보면서 좀 더 이해해야 할 듯싶다.

반응형
Comments