일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 자바
- JSP/Servlet
- 영어공부
- 데이터분석
- SQL
- 컴퓨터구조
- html/css
- CSS
- 머신러닝
- 데이터입출력구현
- numpy/pandas
- 데이터베이스
- 운영체제
- 연습문제
- 텍스트마이닝
- 파이썬
- C++
- 혼공머신
- 코딩테스트
- 중학1-1
- CNN
- 자바 실습
- 정보처리기사실기
- 정수와유리수
- 컴퓨터비전
- 정보처리기사필기
- 딥러닝
- pandas
- 중학수학
- 파이썬라이브러리
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
동시에 실행하기 - 스레드를 이용하여 병렬 처리하기 및 멀티 스레드 이용하기, 원하는 작업을 원하는 시간에 실행하기 본문
동시에 실행하기 - 스레드를 이용하여 병렬 처리하기 및 멀티 스레드 이용하기, 원하는 작업을 원하는 시간에 실행하기
huenuri 2024. 10. 6. 19:07동시 실행과 관련된 파이썬 모듈을 사용하면 한꺼번에 여러 가지 일을 할 수 있다.
스레드를 이용하여 병렬로 처리하려면? - threading
스레드를 이용하여 한 프로세스에서 2가지 일을 동시에 실행할 수 있게 하는 모듈이다.
다음은 페이지 번호를 입력받아 위치독스의 페이지 리소스를 wikidocs_페이지번호.html 파일로 저장하도록 만든 함수이다.
A 씨는 참고 자료를 만드는데, 다음처럼 10개의 위키독스 페이지가 필요하다고 한다.
앞의 함수를 사용하여 페이지 수만큼 실행하여 원하는 결과를 얻을 수 있다. 하지만, A 씨는 10개의 요청을 하나씩 보내기보다 동시에 요청하여 더 빠른 속도로 리소스를 얻고 싶어 한다. 동시에 요청할 수 있도록 하려면 함수를 어떻게 수정해야 할까?
동시에 요청하려면 threading 모듈을 사용하면된다. 먼저 이 모듈을 사용하지 않고 10개의 페이지를 요청할 때 시간이 얼마나 걸리는지 측정해 보자.
수행시간은 총 3초가량 걸렸다. 이번에는 스레드로 병렬 처리하는 threading 모듈을 사용하여 페이지 리소스를 동시에 저장하도록 변경해 보자.
이번에는 동시에 출력이 되다 보니 스레드 출력이 한 줄씩 되지 않고 한 문장으로 되고 있다. 수행 시간도 1초로 매우 짧아졌다.
멀티 프로세스를 이용하여 병렬로 처리하려면? - multiprocessing
멀리 프로세스를 활용하여 2가지 또는 그 이상의 일을 동시에 실행할 수 있게 하는 모듈이다.
다음은 CPU 연산이 많은 heavy_work() 함수를 4번 실행하고 그 소요 시간을 측정하는 예제이다.
이때 heavy_work() 함수를 동시에 실행하여 전체 수행 시간을 단축하려면 어떻게 프로그램을 수정해야 할까?
threading 모듈을 사용하여 문제를 풀고자 한다.
스레드의 실행 순서가 달라졌다. 이처럼 스레드는 CPU 연산만 수행할 때는 수행 시간 단축에 별 도움이 되지 않는다.
이번에는 threading 모듈 대신 multiprocessing 모듈을 사용해 볼 것이다. 이 모듈은 멀티 프로세서와 별개의 메모리를 사용하여 완전히 독립하여 병렬 프로그래밍할 수 있다. 단, 여러 개의 CPU가 있는 멀리 코어 환경에서만 가능하다.
수행 속도가 너무 빨라서 중간에 있는 과정이 하나도 출력되지 않았다. 저자의 컴퓨터보다 내 컴퓨터 환경이 좋은지 5배 이상 빠르게 출력되었다.
아무튼 멀티코어 환경에서는 이전보다 6배 이상 빨라졌음을 확인했다.
원하는 작업을 원하는 시간에 실행하려면? - sched
지정된 시간에 원하는 이벤트를 실행하게 하는 이베트 스케줄러 모듈이다.
먼저 다음 프로그램을 살펴보자.
print_a, print_b, print_c 함수를 한 번씩 호출하는 간단한 프로그럼이다. 이 프로그램을 각각 5초, 3초, 7초 후에 호출하려면 어떻게 해야 할까?
스레드 실행을 잠시 중지하는 time.sleep()을 사용해서 이 문제를 풀 수도 있지만, 이벤트 방식으로 스케줄을 만들어야 한다면 sched 모듈을 사용하는 것이 가장 편리하다.
이렇게 3초, 5초, 7초 후에 모두 잘 출력되었다. sched.scheduler()로 스케줄러 객체 s를 생성한 후 s.enter()로 실행할 이벤트를 등록하면 된다. 이 함수에는 모두 4개의 매개변수를 지정했는데, enter() 함수의 첫 번째 매개변수는 delay 시간(초)을 의미한다. 두 번째 매개변수는 우선순위로, 같은 delay 시간에 1개 이상의 이벤트를 등록할 때 우선순위가 높은 것(낮은 숫자가 우선순위가 높음)부터 시작한다.
세 번째 매개변수는 실행할 함수이고, 네 번째 매개변수는 실행할 함수에 전달할 인수이다.
학습을 마치고
동시에 실행하기 단원에서 중요한 내용만 선별해서 학습해 보았다. 스레드를 이용하여 원하는 시간에 내용을 출력할 수 있다는 것이 정말 신기했다. 역시 공부하길 정말 잘했다는 생각이 든다.
라이브러리 공부를 하면서 컴퓨터 운영체제에 대해 공부하고 싶은 마음이 들어서 조금 전에 책을 한 권 주문했다.
'프로그래밍 언어 > 파이썬' 카테고리의 다른 글
네트워크와 프로세스 간 통신 다루기 2 - SSL 서버 통신 및 여러 명 동시에 서버 접속하기 (1) | 2024.10.06 |
---|---|
네트워크와 프로세스 간 통신 다루기 1 - 비동기 방식으로 프로그래밍하기 및 서버와 통신하는 게임 만들기 (0) | 2024.10.06 |
운영체제 다루기 - 디버깅용 로그 남기기 및 터미널 프로그램 만들기, 시스템 정보 알아보기 (0) | 2024.10.06 |
파일과 디렉터리 다루기 - 디렉터리 구성 및 특정 파일 찾기 (0) | 2024.10.06 |
함수형 프로그래밍 다루기 2 - 순열과 조합, 좌표 정렬하기 (0) | 2024.10.06 |