环境搭建

安装centos7并配置nginx

1. 添加repo源
# vi /etc/yum.repos.d/nginx.repo

内容如下:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

2. 安装
# yum install -y nginx

3. 启动
# systemctl start nginx
# systemctl enable nginx

同步阻塞

1.1 在windows下创建文件夹test,在文件夹下创建日志模块logger.py(后续windows文件都放入同一个文件夹下)

import os
import time
import logging

logger = logging.getLogger('aiotest')
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter(
    '%(asctime)s - %(filename)s[line:%(lineno)d] - <%(threadName)s %(thread)d>' +
    '- <Process %(process)d> - %(levelname)s: %(message)s'
)

basedir = os.path.abspath(os.path.dirname(__file__))
log_dest = os.path.join(basedir, 'logs')  # 日志文件所在目录
if not os.path.isdir(log_dest):
    os.mkdir(log_dest)
filename = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time())) + '.log'  file_handler = logging.FileHandler(os.path.join(log_dest, filename))  # 创建日志文件handler
file_handler.setFormatter(formatter)  # 设置Formatter
file_handler.setLevel(logging.INFO)  # 单独设置日志文件的日志级别

stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
# stream_handler.setLevel(logging.INFO)  # 单独设置控制台日志的日志级别,注释掉则使用总日志级别
logger.addHandler(file_handler)
logger.addHandler(stream_handler)

1.2 在centos中放入文件flags.tar.gz

将flags.tar.gz文件导入到/usr/share/nginx/html中,并解压tar xf flags.tar.gz
#cd /usr/share/nginx/html
#ls flags > flags.txt
将flags文件夹下的文件名写入flags.txt中,以便后续使用

1.3 在windows下创建common.py

import os
import time
import requests
from logger import logger

basepath = os.path.abspath(os.path.dirname(__file__))  # 当前模块文件的根目录

def setup_down_path():
    '''设置图片下载后的保存位置,所有图片放在同一个目录下'''
    down_path = os.path.join(basepath, 'downloads')
    if not os.path.isdir(down_path):
        os.mkdir(down_path)
        logger.info('Create download path {}'.format(down_path))
    return down_path

def get_links():
    '''获取所有图片的下载链接'''
    with open(os.path.join(basepath, 'flags.txt')) as f:
        return ['http://192.168.157.134/flags/' + flag.strip() for flag in f.readlines()]


def download_one(image):  #后续多线程时concurrent.futures.ThreadPoolExecutor.map()
    '''
    下载一张图片
    param image: 字典,包括图片的保存目录、图片的序号、图片的URL
    '''
    logger.info('Downloading No.{} [{}]'.format(image['linkno'], image['link']))
    t0 = time.time()

    resp = requests.get(image['link'])
    filename = os.path.split(image['link'])[1]
    with open(os.path.join(image['path'], filename), 'wb') as f:
        f.write(resp.content)  # resp.content是bytes类型,而resp.text是str类型

    t1 = time.time()
    logger.info('Task No.{} [{}] runs {} seconds.'.format(image['linkno'], image['link'], t1 - t0))

1.4 在windows下创建sequential.py

import time
from common import setup_down_path, get_links, download_one
from logger import logger

def download_many():
    '''依序下载所有图片,同步阻塞'''
    down_path = setup_down_path()
    links = get_links()

    for linkno, link in enumerate(links, 1):
        image = {
            'path': down_path,
            'linkno': linkno,  # 图片序号,方便日志输出时,正在下载哪一张
            'link': link
        }
        download_one(image)

    return len(links)

if __name__ == '__main__':
    t0 = time.time()
    count = download_many()
    msg = '{} flags downloaded in {} seconds.'
    logger.info(msg.format(count, time.time() - t0))