python multithread 공부해보기

루까까·2023년 7월 15일

  • python 자동화에 대해서 공부하는 도중 멀티쓰레딩, 멀티 프로세스라는 개념을 배우게 되었다.
  • 다중처리가 자동화에 많은 도움이 될 것 같다는 생각에 공부를 시작하였고 공부한 것에 대해서 끄적인 글이다.

python은 기본적으로 스크립트 언어이다.
소스코드를 한 줄씩 읽어 들여 싱글쓰레드에서 순차적으로 동작하기에(쉽게 말해, 위에서 아래로 물 흐르듯이)
여러 가지일을 병렬적으로(또는, 동시다발적으로) 처리하기 위해서는 다양한 장치들이 있어야 한다.
그 장치라는 것이 바로 '멀티 쓰레딩, 멀티 프로세스'이다.

멀티 쓰레딩, 멀티 프로세스에 말하기 앞서 쓰레드가 뭔지 프로세스간 뭔지 알아보자.

쓰레드? 프로세스? 차이점은 무엇일까?

1. process(프로세스)

  • 프로세스란 실행중에 있는 프로그램을 의미한다.
  • 프로그램을 실행하면 실행을 위해서 메모리할당이 되고, 할당된 메모리공간으로 바이너리 코드가 올라간다.(이 순간부터를 프로세스라고 한다)
    • 각각 메모리할당을 받기에 다른 프로세스가 종료된다고 해도 서로 영향을 받지 않아 작업이 중단되지 않는다.
  • 프로세스 내부에는 최소 하나의 쓰레드를 갖는다.

2. thread(쓰레드)

  • 프로세스내에서 실제로 작업을 수행하는 주체를 말한다.
  • 하나의 프로세스내에서 여러 쓰레드가 생성될 수 있으며(이것을 멀티쓰레드라고 한다.) 부모 프로세스의 메모리를 공유 받기에 다른 쓰레드와도 영향을 받는다.

프로세스와 쓰레드에 대해서 알아보았다. 그럼 이제 싱글이 아닌 멀티로 python을 동작시키는 멀티 쓰레딩, 멀티 프로세스에 대해서 알아보자.

멀티 쓰레딩, 멀티 프로세스 차이점은 무엇일까?

1. 멀티 프로세스(multiProcessing)

  • 이름 그대로 여러개의 프로세스를 동시에 실행시키는 것
  • 앞서 설명한 것 처럼 프로세스를 다중으로 처리하는 것이라 각각 프로세스마다 메모리 할당이 되어 고유한 독립 메모리 공간을 차지
    • 많은 리소스 필요
    • 무겁고 큰 메모리 공간필요
    • 메모리 주소와 공간이 다르기에 프로세스간 통신이 어려움
    • 메모리가 다르기에 프로스세끼리 영향을 받지않아 안정성 확보

2. 멀티 쓰레딩(multiThread)

  • 하나의 프로세스안에서 여러 스레드를 실행시키는 것
  • 하나의 부모 프로세스안에서 동작
    • 부모 프로세스와 같은 공뮤 메모리 공간 차지
    • 가볍고 메모리 사용량 적음
    • 자원을 공유하기에 동기화 문제 가능성이 있음
      • 병목현상, 데드락 등
    • 하나의 쓰레드가 문제가 발생하면 전체 프로세스에 영향

멀티 프로세스 VS 멀티 쓰레딩에 대한 의견

  • 서로 장단점이 있기에 상황에 맞게 쓰는 것이 좋을 것 같다.
  • 개인적으로 python 멀티를 공부함에 있어 자동화 분야에는 멀티 쓰레딩이 많이 쓰일 것 같다는 생각이 들었다.(여러 사이트 크롤링?, 여러 api 활용 아니면 여러 DB 활용?)
  • 따라서 멀티 프로세스는 간단히 개념에 대해서만 배워가고 멀티 쓰레딩을 따로 코드로 실습을 진행하였다.
  • 아래에 기술된 코드가 실제 공부하였던 코드이다.
import requests
from multiprocessing.dummy import Pool as ThreadPool


def crawling(url):
    data = requests.get(url)
    return data.content

url = ['https://www.naver.com/','https://velog.io/@lcs3947']

pool = ThreadPool(4)
result = pool.map(crawling, url)
pool.close()
pool.join()

print(result)

map 추가 설명

map은 list의 요소를 지정된 함수로 처리해주는 것
사용방법은 map(def,list)이다.
쉽게 말해 이런 list가 있다고 가정하자.

list = [2,3,4]

이 list의 요소들에다가 각각 1씩 더하고 싶다면 어떻게 해야 할까?
보통은 for문을 돌려 제어할 수 있다.

list = [2,3,4]
for i in range(len(list)):
    list[i] = list[i] + 1
print(list)

하지만 map을 이용하면 조금 더 색다르게 제어할 수 있다.

ex_list = [2,3,4]
def plus(x):
	return x + 1
result = map(plus, ex_list)
ex_list = [2,3,4]
def plus(x):
	return x + 1
result = map(plus, ex_list)
print(list(result))

둘 다 같은 값 [3,4,5]를 보여 준다.
(단순 더하기라 map을 이용하는 것이 for문을 이용하는 것보다 길어보이는 것은..)

출처: https://iambeginnerdeveloper.tistory.com/186, https://blockdmask.tistory.com/22, https://velog.io/@xxhaileypark/%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9CMulti-Thread-%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4Multi-process

profile
기타치는 개발자

0개의 댓글