#url 이미지를 저장하는 함수 defsave_img(idx, img_url): res = requests.get(img_url).content withopen(f'{idx}.jpg', 'wb') as f: # 이미지 관련 작업은 pillow 모듈을 사용하는게 좋다 # 예제에서는 사용 안함 (따로 설치가 필요) f.write(res) print(f'save {idx}')
with ThreadPoolExecutor(max_workers=10) as executor: for idx, res_data inenumerate(reg_iter): # url 을 뽑아내는 전처리 작업 img_url = res_data.group().split('oimgurl:')[1].split(', cpid')[0].replace('"', '') executor.submit(save_img, idx, img_url)
t2 = time.time() print(t2 - t1)
작업결과
마찬가지로 작업 시간이 1초대로 단축된 걸 확인 할 수 있다
결론
I/O 작업이 있을 때 병렬 처리 작업을 활용하여 작업 시간을 단축시킬수 있다
상황에 따라 다르지만 될 수 있으면 thread 모듈보단 고수준 비동기 concurrent.futures 모듈을 사용하자 병렬처리 작업의 결과물을 리턴 받는 등 다양한 함수를 제공한다 참조링크
url = 'https://search.daum.net/search?w=img&nil_search=btn&DA=NTB&enc=utf8&q=%EA%B0%95%EC%95%84%EC%A7%80' html = requests.get(url=url) html_raw_data = str(html.content)
reg_iter = reg.finditer(html_raw_data)
#url 이미지를 저장하는 함수 defsave_img(idx, img_url): res = requests.get(img_url).content withopen(f'{idx}.jpg', 'wb') as f: # 이미지 관련 작업은 pillow 모듈을 사용하는게 좋다 # 예제에서는 사용 안함 (따로 설치가 필요) f.write(res) print(f'save {idx}')
for idx, res_data inenumerate(reg_iter): # url 을 뽑아내는 전처리 작업 img_url = res_data.group().split('oimgurl:')[1].split(', cpid')[0].replace('"', '') save_img(idx, img_url)
t2 = time.time()
print(t2-t1)
이렇게 하면 이미지가 저장되는 걸 볼 수 있다
작업이 4초 넘게 걸렸는데 다음 포스트에서는 thread 와 비동기 함수를 사용하여 작업 시간을 단축시키는 포스트를 올려보겠습니다