Python3爬虫系列05 (实验) - 多线程并发下载

  • 原创
  • Madman
  • /
  • /
  • 0
  • 1560 次阅读

spider 05-min.png

Synopsis: I/O密集型最适合使用多线程,当然包括网络I/O。我们要下载多张图片,每次去下载一张图片,就是发起一次HTTP请求(使用TCP协议),客户端首先通过socket.socket()创建一个套接字,然后调用connect()方法经过三次握手与服务端建立TCP连接,这个过程是阻塞的。建立连接后,客户端将请求(要访问图片资源)发送给服务端,然后服务端返回响应,客户端用recv()方法每次接收一定数量的字节,客户端在每个响应报文(一张图片有多个数据包)到达操作系统内核时,是阻塞的。网络I/O对于CPU来说是无比漫长的,如果是依序下载,CPU就要一直阻塞到第1张图片的字节全部下载完成后,才能下载第2张,这些等待的时间(对CPU来说,比它处理数据的时间多出无数倍)就白白浪费了。为了合理利用CPU资源,可以使用多线程,每个线程去下载一张图片,当下载第1张图片的任务阻塞时,CPU切换到第2个线程,它开始下载第2张图片,依次类推,当第1张图片有响应报文到达时,等其它线程阻塞后,CPU又会切换到下载第1张图片的那个线程

代码已上传到 https://github.com/wangy8961/python3-concurrency ,欢迎star

1. threading和Queue

threading模块可以实现多线程,Queue模块创建线程级安全的队列,各线程从队列中取任务并执行

import time
from queue import Queue
from threading import Thread
from common import setup_down_path, get_links, download_one_1
from logger import logger


class ThreadWorker(Thread):
    def __init__(self, queue):
        Thread.__init__(self)
        self.queue = queue

    def run(self):
        while True:
            down_path, linkno, link = self.queue.get()
            download_one_1(down_path, linkno, link)
            self.queue.task_done()


def download_many():
    '''多线程,按线程数 并发(非并行) 下载所有图片'''
    down_path = setup_down_path()
    links = get_links()

    # 创建队列
    queue = Queue()

    # 创建多个线程
    for i in range(4):
        worker = ThreadWorker(queue)
        worker.daemon = True  # 如果工作线程在等待更多的任务时阻塞了,主线程也可以正常退出
        worker.start()  # 启动线程

    # 往队列中投放任务
    for linkno, link in enumerate(links, 1):  # 链接带序号
        logger.info('Queueing No.{} {}'.format(linkno, link))
        queue.put((down_path, linkno, link))

    logger.info('Waiting for all subthread done...')
    # Causes the main thread to wait for the queue to finish processing all the tasks
    queue.join()
    logger.info('All subthread done.')

    return len(links)


if __name__ == '__main__':
    t0 = time.
                                
                            
  • zhilstroy_75
b4
  • Zayne
  • Kevin
  • 王松
  • guozhengli
  • 浮川大大
  • sunnoy
  • wuwu52025
  • qczrzl
  • JavDriver
  • o_7yue
  • gthank
未经允许不得转载: LIFE & SHARE - 王颜公子 » Python3爬虫系列05 (实验) - 多线程并发下载

分享

作者

作者头像

Madman

如需 Linux / Python 相关问题付费解答,请按如下方式联系我

0 条评论

暂时还没有评论.