관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

동시에 실행하기 - 스레드를 이용하여 병렬 처리하기 및 멀티 스레드 이용하기, 원하는 작업을 원하는 시간에 실행하기 본문

프로그래밍 언어/파이썬

동시에 실행하기 - 스레드를 이용하여 병렬 처리하기 및 멀티 스레드 이용하기, 원하는 작업을 원하는 시간에 실행하기

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개 이상의 이벤트를 등록할 때 우선순위가 높은 것(낮은 숫자가 우선순위가 높음)부터 시작한다.

세 번째 매개변수는 실행할 함수이고, 네 번째 매개변수는 실행할 함수에 전달할 인수이다. 

 


 

 

 

학습을 마치고

동시에 실행하기 단원에서 중요한 내용만 선별해서 학습해 보았다. 스레드를 이용하여 원하는 시간에 내용을 출력할 수 있다는 것이 정말 신기했다. 역시 공부하길 정말 잘했다는 생각이 든다.

라이브러리 공부를 하면서 컴퓨터 운영체제에 대해 공부하고 싶은 마음이 들어서 조금 전에 책을 한 권 주문했다.