python -线程池实现生产者消费者模型
之前我们学过多线程的生产者消费者模型
还以这个判断端口是否可以访问为例:
先生成数据:
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("测试数据创建完成!")
create_data()
修改几个ip为真实存在的
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("测试数据创建完成!")
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):
# 获取producer的返回值;
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)
main()