Pythonマルチスレッドで生産者消費者モードで闘図網を這う表情画像を実現


生産者消費者モデルとは
一部のモジュールは、他のモジュールによって処理されるデータの生産を担当します(ここでは、関数、スレッド、プロセスなど).データを生成するモジュールを生産者と呼び,データを処理するモジュールを消費者と呼ぶ.生産者と消費者の間のバッファを倉庫と呼ぶ.生産者は倉庫への商品の輸送を担当し、消費者は倉庫から商品を取り出すことを担当し、生産者消費者モデルを構成している.
生産者消費者モデルの利点
  • デカップリングは、生産者と消費者がそれぞれ2つのスレッドであると仮定する.生産者に消費者の方法を直接呼び出させると、生産者は消費者に依存する(すなわち結合する).将来消費者のコードが変化すると、生産者のコードに影響を及ぼす可能性があります.一方、両方がバッファに依存している場合、両者の間に直接依存しない場合、結合もそれに応じて低下します.
  • 同時生産者と消費者は2つの独立した同時体であり、彼らの間はバッファで通信しているため、生産者はバッファにデータを捨てるだけで、次のデータを生産し続けることができ、消費者はバッファからデータを取るだけで、お互いの処理速度のためにブロックが発生しない.
  • は、生産者がデータを製造するのが速い場合、消費者は処理に間に合わず、未処理のデータは一時的にバッファに存在し、徐々に処理することができることをサポートしている.消費者のパフォーマンスによってデータが失われたり、生産者の生産に影響を与えたりすることはありません.

  • ≪インスタンス|Instance|emdw≫
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # @Time    : 2017/12/4 16:29
    # @Author  : YuLei Lan
    # @Email   : [email protected]
    # @File    : urls.py
    # @Software: PyCharm
    
    import requests
    import os
    from urllib.request import urlretrieve
    from bs4 import BeautifulSoup
    import threading
    
    BASE_PAGE_URL = 'http://www.doutula.com/photo/list/?page='
    PAGE_URL_LIST = []  #        
    FACE_URL_LIST = []  #      url  
    gLock = threading.Lock()
    
    def get_page_url():
        for i in range(1, 2):
            url = BASE_PAGE_URL + str(i)
            PAGE_URL_LIST.append(url)
    
    def procuder():
        """
               
                        img_url  
        """
    
        while len(PAGE_URL_LIST) != 0:  #     for  
            gLock.acquire()
            page_url = PAGE_URL_LIST.pop()
            gLock.release()
    
            response = requests.get(page_url)
            text = response.text
            soup = BeautifulSoup(text, 'lxml')
            img_list = soup.find_all('img', attrs={'class': 'img-responsive lazy image_dta'})
    
            gLock.acquire()
            for img in img_list:
                img_url = img['data-original']
                if not img_url.startswith('http:'):
                    img_url = 'http:{}'.format(img_url)
                FACE_URL_LIST.append(img_url)
            gLock.release()
    
    def customer():
        """     """
    
        while True:
            if len(FACE_URL_LIST) == 0:
                continue
            else:
                img_url = FACE_URL_LIST.pop()
                tmp_list = img_url.split('/')
                filename = tmp_list.pop()
                path_file = os.path.join('images', filename)
                urlretrieve(img_url, filename=path_file)
    
    def main():
        for i in range(3):
            th = threading.Thread(target=procuder)
            th.start()
    
        for i in range(5):
            th = threading.Thread(target=customer)
            th.start()
    
    if __name__ == '__main__':
        get_page_url()
        main()