최근에 팀 토이 프로젝트를 하면서 크롤링을 하고 있는데 크롤링해야 하는 데이터 양이 많다 보니 데이터 수집하는데 시간이 너무 오래 걸리는 것을 느꼈고 방법이 없을까 하다가 문득 머릿속에 병렬 처리 방법이 떠오르게 되었다. 그래서 바로 시도해봤고 나름 성공적으로 되어서 혹시 나와 같은 사람들이 있다면 python multiprocessing을 사용하여 병렬 처리를 해보자!
*예제 코드
import multiprocessing
def crawling(s,e,lists):
divide=[(1,6),(6,11),(11,16),(16,21),(21,26),(26,31),(31,36)]
manager=multiprocessing.Manager()
lists=manager.list()
process=[]
for start,end in divide:
p=multiprocessing.Process(target=crawling,args=(start,end,lists))
process.append(p)
p.start()
for p in process:
p.join()
위의 코드는 내가 현재 크롤링에서 사용하고 있는 코드이다. 코드를 위에서부터 설명해보면
- import multiprocessing으로 병렬처리를 하기 위한 라이브러리를 불러와주고 def crawling (크롤링하려는 코드 함수를 의미) 만들어 준다 편의상 나는 크롤링하는 코드를 생략한 것이므로 각자 자신의 코드를 넣어주면 될 것 같다!
- divide 변수를 보면 숫자로 나눠져 있는데 이것은 크롤링 하려는 페이지에 있는 XPATH를 의미한다고 생각하면 되는데 간단하게 말해보면 1~36번까지의 정보를 크롤링한다고 생각하면 된다. 여기서 7개의 파트로 나눴는데 그 이유는 병렬 처리를 7개로 나누었기 때문이고 각각 자신이 원하는 만큼으로 나누어 주면 된다
- manager은 전역변수를 선언하게 도와주는 모듈이며 multiprocessing.Manager()로 선언할 수 있다 나는 여기서 크롤링된 데이터를 리스트에 모은 후 DF로 만들 생각이었기 때문에 전역 변수 list를 만들어서 사용했다. 여기서. list() 말고도 다양한 형태로 선언이 가능하니 각자 사용하고 싶은 형태를 사용하면 될 것 같다.
- multiprocessing.Process(target='각자 병렬처리를 사용할 함수', args=(사용할 함수에 인자))를 넣어주어 선언한다 그 후 process 리스트에 이런 정보를 넣고 .start()를 사용하여 병렬 처리를 시작한다
- 앞서 process에 병렬처리를 하려는 함수들의 정보를 모은 이유는 .join()을 사용하기 위해서였다. 간단하게 설명하면 .start()는 시작 .join()은 종료를 의미한다고 보면 된다

Multiprocessing 사용시 주의사항
- 너무 많은 프로세스를 사용하게 되면 CPU에 부담이 될 수 있으니 자신의 컴퓨터 사양에 맞춰서 사용해야 한다 구글링을 통해 알아보니 대략적으로 자신의 CPU core 수에 *2 정도가 최대라는 것 같다.
- 크롤링을 할 때 병렬 처리를 하게 되면 자신의 네트워크 상태에 따른 영향을 조금 많이 받는 것 같다 실제로 핸드폰 핫스팟을 사용해보니 최대 process는 3개 정도이고 LAN을 사용하여할 때는 최대 8개 정도인 것 같다. 또한 만약 크롤링 시에 process를 너무 과도하게 많이 하게 되면 사이트에서 차단을 당할 수 있으니 각별하게 주의해야 한다.
'프로그래밍 > python' 카테고리의 다른 글
[Python] python으로 notion에 글쓰기 (0) | 2023.11.07 |
---|---|
[Python] pandas or pyspark to_csv 테이블 깨짐현상 해결법 (0) | 2022.08.03 |