- 4
- 이니스프리
- 조회 수 1045
안녕하세요??
주말 잘 보내고 계시는가요?? ^-^
from concurrent.futures import ThreadPoolExecutor을 이용하여 다수의 이미지를 크롤링하는 경우에 대해 질문 드립니다.
def down_file(url, s, name, dir): r = s.get(url) if r.status_code == 200: filename = dir + '\\' + name print(filename) with open(filename, 'wb') as f: f.write(r.content) return s with ThreadPoolExecutor(max_workers=8) as executor: for p in prvs: href = p.find('a')['href'] url = 'URL을 입력하세요' + href html = s.get(url).content soup = BeautifulSoup(html, 'html5lib') a_tags = soup.find('div', {'id':'galerie-listing-photos'}).find_all('a') for a in a_tags: url = 'URL을 입력하세요' + a['href'] name = url.split('/')[-1] executor.submit(down_file, url, s, name, dir)
이와 같이 with 문을 사용하여 실행을 해봤고, 아래와 같이 with 문을 사용하지 않고 실행을 해봤어요~!
# 다운로드 함수 생략 pool = ThreadPoolExecutor(max_workers=8) for p in prvs: href = p.find('a')['href'] url = 'URL을 입력하세요' + href html = s.get(url).content soup = BeautifulSoup(html, 'html5lib') a_tags = soup.find('div', {'id':'galerie-listing-photos'}).find_all('a') for a in a_tags: url = 'URL을 입력하세요' + a['href'] name = url.split('/')[-1] pool.submit(down_file, url, s, name, dir)
그런데 전자가 후자보다 다운로드 받은 파일 수가 더 많은데요 ㅠㅠ
후자에서 어떤 문제가 발생한 것 같은데 무엇 때문에 이러한 문제가 발생했는지 여쭤봅니다.
with 문으로 사용하지 않으면 스레드 간에 충돌이 발생하는건가요??
그럼 비 조심하시고 편안한 주말 되세요 :)
항상 감사드려요!! ^^
작성자
댓글 4
+1
2020.08.09. 23:36
humit 님 안녕하세요??
번번이 큰 도움을 주셔서 정말 감사합니다!!
공식문서를 읽는 습관을 들여야 된다는 생각은 늘 하는데...
이번에도 제가 깜빡했네요 ㅠㅠㅠㅠㅠ
제가 제대로 이해했는지 모르겠지만 Executor 인스턴스를 shutdown 하지 않으면
어디에선가 꼬이는가 보군요 ㅜㅜ
구글링해봐도 with 문을 사용하는 경우가 대부분이네요!
병렬작업 실행은 잘 작성하면 정말 효율적인데 저한테는 아직 어렵네요 ㅠㅠ
제가 구매한 서적들에는 이 부분을 제대로 다루지 않던데 어떻게든 더 공부를 해봐야겠어요~
그럼 humit 님께서도 좋은 오후 되시고 태풍이 온다던데 피해가 없으시길 기원할게요!
항상 감사드려요!
번번이 큰 도움을 주셔서 정말 감사합니다!!
공식문서를 읽는 습관을 들여야 된다는 생각은 늘 하는데...
이번에도 제가 깜빡했네요 ㅠㅠㅠㅠㅠ
제가 제대로 이해했는지 모르겠지만 Executor 인스턴스를 shutdown 하지 않으면
어디에선가 꼬이는가 보군요 ㅜㅜ
구글링해봐도 with 문을 사용하는 경우가 대부분이네요!
병렬작업 실행은 잘 작성하면 정말 효율적인데 저한테는 아직 어렵네요 ㅠㅠ
제가 구매한 서적들에는 이 부분을 제대로 다루지 않던데 어떻게든 더 공부를 해봐야겠어요~
그럼 humit 님께서도 좋은 오후 되시고 태풍이 온다던데 피해가 없으시길 기원할게요!
항상 감사드려요!
2020.08.10. 13:41
+1
좀더 상세하게 말씀드리자면 shutdown 메서드를 사용하지 않으면 메인 프로세스가 종료된 경우 Executor에 들어온 작업이 실행이 끝날 때까지 대기하는 것이 아니라 바로 종료가 되게 됩니다. 그래서 두 번째 경우에 실행되다가 중간에 종료가 되어서 개수가 적은 것이라고 생각하시면 됩니다.
2020.08.11. 23:08
앗 그런 과정에서의 차이가 발생하여 결과가 달라지는 것이군요~ ^-^
정말 감사합니다!!
덕분에 또 많이 배웠네요 :)
그럼 humit 님께서도 비 조심하시고 굿밤 되세요!
정말 감사합니다!!
덕분에 또 많이 배웠네요 :)
그럼 humit 님께서도 비 조심하시고 굿밤 되세요!
2020.08.11. 23:18
권한이 없습니다.
이 내용이 도움이 되실 거 같네요.