2023年7月4日火曜日

requests + Thread する場合は必ず close するようにしなければならない

requests + Thread する場合は必ず close するようにしなければならない

概要

そうしないと ConnectionError や Too many open files になり途中で必ず終了してしまいます

環境

  • macOS 13.4.1
  • Python 3.11.3

サンプルコード

今回は Session を使っています
Session を使う場合は必ずスレッド作成時に Session も作成する必要があります
ポイントは response を必ず閉じるような処理にしている点です

import threading

import requests


class Downloader(threading.Thread):
    def __init__(self, url: str, filename: str):
        super().__init__()
        self.url = url
        self.filename = filename

    def run(self):
        response = None
        try:
            print(f"Target file url: {self.url}")
            with requests.Session() as session:
                response = session.get(self.url)
                if response.status_code == 200:
                    download_path = f"./imgs/{self.filename}"
                    with open(download_path, "wb") as file:
                        file.write(response.content)
                        print(f"\033[0;32mDonload complete: {download_path}\033[00m")
        except Exception:
            if response:
                response.close()


if __name__ == "__main__":
    threads = []
    for filename in ["file1", "file2", "file3"]:
        url = f"http://localhost/{filename}"
        dl = Downloader(url, filename)
        dl.start()
        threads.append(dl)
    for t in threads:
        t.join()

0 件のコメント:

コメントを投稿