David의 개발 이야기!

멀티프로세싱, 멀티스레드 개념을 대략 이해하고 크롤러에 적용하기 본문

크롤링 공부

멀티프로세싱, 멀티스레드 개념을 대략 이해하고 크롤러에 적용하기

david.kim2028 2023. 6. 11. 17:49
반응형

백만개의 데이터를 수집한다고 가정해보자

url 하나 수집하는데, 0.1초가 걸린다고 하면, 대략적으로 10만초, 27시간이 걸린다.

 

해결책은, 멀티프로세싱 또는 멀티스레드를 사용하면된다.

파이썬 실행창 프로세스를 여러개 띄우는 멀티프로세스를 쓰거나,

PC에 내장된 CPU 를 스레드 여러개로 작업을 나눠서 시키면 된다.

 

해당 예제에서는, mulitprocessing.Pool.map 이라는 함수를 사용해서 구현했다.

 

1. 기본 내장 라이브러리 불러오기 ( 멀티스레딩 하는 코드임. 멀티프로세스를 원한다면, .dummy를 제거하면 됌)

2. ThreadPool() 에다가 몇개의 프로세스/스레드 로 동시에 작업을 시킬지 숫자로 적음

3. map(적용시킬 함수, 리스트)

4. close(), join() 을 차례로 해주면 됌 (작업을 그만하고, 작업한 것을 가져오라는 의미임)

 

import requests
import json
import time

url = [
  "https://tb.coinone.co.kr/api/v1/chart/olhc/?site=coinoneeth&type=1h&last_time=1609524000000",
  "https://tb.coinone.co.kr/api/v1/chart/olhc/?site=coinoneeth&type=1h&last_time=1608811200000",
  "https://tb.coinone.co.kr/api/v1/chart/olhc/?site=coinoneeth&type=1h&last_time=1608098400000",
  "https://tb.coinone.co.kr/api/v1/chart/olhc/?site=coinoneeth&type=1h&last_time=1606672800000",
  "https://tb.coinone.co.kr/api/v1/chart/olhc/?site=coinoneeth&type=1h&last_time=1605960000000",
  "https://tb.coinone.co.kr/api/v1/chart/olhc/?site=coinoneeth&type=1h&last_time=1605242700000",
  "https://tb.coinone.co.kr/api/v1/chart/olhc/?site=coinoneeth&type=1h&last_time=1604534400000",
  "https://tb.coinone.co.kr/api/v1/chart/olhc/?site=coinoneeth&type=1h&last_time=1603821600000",
  "https://tb.coinone.co.kr/api/v1/chart/olhc/?site=coinoneeth&type=1h&last_time=1603108800000",
  "https://tb.coinone.co.kr/api/v1/chart/olhc/?site=coinoneeth&type=1h&last_time=1602396000000",
]

def func1(a):
    data = requests.get(a)
    dict1 = json.loads(data.content)
    return dict1['data'][0]['Close']

#멀티프로세스싱
#리스트내 모든 자료에 똑같은 작업을 시켜주고 싶을때 -> map 함수 map(리스트에 적용할 함수, 리스트)
#실전에선, 수집필요한 모든 url 을 리스트에 담아둔 다음, 크롤러함수와 함께 map 에 집어 넣게 됌
from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(4) # 몇개를 동시에 처리한다
result = pool.map(func1, url) # 하나하나의 url 이 함수에 들어갔다 나옴
pool.close()
pool.join()

print(result)

 

* map 함수 사용법

map(리스트 각각의 원소에 적용시킬 함수, 리스트)

 

따라서, 실전에서는,

수집에 필요한 모든 url 을 리스트 [] 에 담고,

url 을 입력하면 수집결과를 뱉어주는 크롤러함수를 만든다음,

동시에 멀티스레딩 map 함수에 집어 넣으면 된다!!

반응형
Comments