美文网首页
多线程练习

多线程练习

作者: sixkery | 来源:发表于2018-11-04 12:55 被阅读14次

__author__ = 'sixkery'

'''多线程下载高清图片,因为图片太大,故用多线程下载图片
把图片的 url 放入队列,提取队列里的url,并下载。'''


import threading
import requests, time, os
from queue import Queue
from urllib import request


# 定义一个装饰器,查看运行时间
def run_time(func):
    def wrapper(*args,**kwargs):
        start = time.time()
        func(*args,**kwargs)
        end = time.time()
        print('程序运行时间{}'.format(end-start))
    return wrapper


class spider():
    def __init__(self):
        self.thread_num = 10 # 线程数
        self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36'}
        self.qurl = Queue() # 存储 url 的队列
        self.num = 1
        
        # 创建一个文件夹,用来存放下载图片
        if '图片' not in os.listdir('.'):
            os.mkdir('图片')
        self.path = os.path.join(os.path.abspath('.'),'图片')
        os.chdir(self.path)

    # 用来抓取图片的 url 并放入队列中 
    def product_url(self):
        for i in range(1):
            url = 'https://unsplash.com/napi/photos?page={}&per_page=12&order_by=latest'.format(i)
            response = requests.get(url,headers=self.headers)
            items = response.json()
            for item in items:
                url = item['links']['download']
                # 放入队列
                self.qurl.put(url)
                
    # 用来下载图片
    def download(self):
        while not self.qurl.empty():
            url = self.qurl.get()
            response = requests.get(url,headers=self.headers)
            title = url.split('/')[-2]
            with open(title + '.jpg','wb') as f:
                f.write(response.content)
            print('第{}张图片下载成功'.format(self.num))
            self.num += 1

    @run_time
    def run(self):
        self.product_url()

        ths = []
        
        for i in range(self.thread_num):
            th = threading.Thread(target=self.download)
            th.start()
            ths.append(th)
        for i in ths:
            i.join()



if __name__ == '__main__':
    spider().run()




相关文章

  • 多线程交替打印1~10的奇偶数

    题外话 今天终于周末了,没有出去运动,最近学了多线程,想练习下,找了到练习题,多线程交替打印1到100的奇偶数。 ...

  • ABC三个线程如何保证顺序执行

    介绍 最近看看多线程练习题,练习下多线程,这道题:ABC三个线程如何保证顺序执行。三个线程同时启动,然后按照顺序执...

  • GCD练习

    GCD练习 ios 多线程 GCD : ios 多线程 全剧队列,异步执行 线程间通信 信号量 文件锁 单利模式 ...

  • 无标题文章

    ####把所有多线程练习一遍 * dispatch * NSOperation * pthread * NSThread

  • 多线程练习

    一个进程结束的前提为进程内所有线程结束。结束子线程-->让子线程中的任务结束(就是让run方法结束:结束循环多用添...

  • 多线程练习

    要求:(1)自定义容器,提供新增元素(add)和获取元素数量(size)的方法。(2)启动两个线程。线程1向容器中...

  • 多线程练习

  • java多线程学习小案例

    多线程的小练习 需求:实现一次修改一次输出 主要知识点:多线程,同步,等待和唤醒

  • 2020-07-02【多线程】

    进程 线程 多线程的实现方式1 设置/获取线程名称 线程调度 线程控制 线程生命周期 多线程实现方式2 练习 同步...

  • 多线程练习--死锁

    关于java的死锁可能网上一大堆的代码,作为初学者我觉得还是很有必要练习下,亲自实现,并分析其死锁的原理。 死锁的...

网友评论

      本文标题:多线程练习

      本文链接:https://www.haomeiwen.com/subject/izprxqtx.html