线程池实现生产者消费者模型

什么是生产者-消费者模型

某个模块专门负责身缠数据, 可以认为是工厂;
另外一个模块负责对生产的数据进行处理的, 可以认为是消费者.
在生产者和消费者之间加个缓冲区(队列queue实现), 可以认为是商店.

生产者 -----》缓冲区 -----》 消费者

优点:

1). 解耦:生产者和消费者的依赖关系减少;
2). 支持并发;是两个独立的个体, 可并发执行;

“”"

def create_data():
    """创建测试数据,  文件中生成200个IP"""
    with open('doc/ips.txt', 'w') as f:
        for i in range(200):
            f.write('172.25.254.%s\n' % (i + 1))
        print("测试数据创建完成!")


import time
import threading
from queue import Queue
from urllib.request import urlopen
from concurrent.futures import ThreadPoolExecutor


def producer(url):
    """生产测试需要的url地址http://ip:port"""
    print("生产者生产url:%s" % (url))
    return url


def consumer(future):
    # 获取consumer的返回值;
    url = future.result()
    try:
        urlObj = urlopen(url)
    except Exception as e:
        print("%s不可访问" % (url))
    else:
        pageContentSize = len(urlObj.read().decode('utf-8'))
        print("%s可以访问, 页面大小为%s" % (url, pageContentSize))


def main():
    pool = ThreadPoolExecutor(max_workers=5)
    ports = [80, 443, 7001, 7002, 8000, 8080, 9000, 9001]

    with open("doc/ips.txt") as f:
        for line in f:
            ip = line.strip()
            for port in ports:
                url = "http://%s:%s" % (ip, port)
                # producer函数的返回值会回调给consumer函数;
                res = pool.submit(producer, url).add_done_callback(consumer)
# create_data()
main()

猜你喜欢

转载自blog.csdn.net/qq_43279936/article/details/87893659