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