python模板单线程秒变多线程爬虫可用高效率

嫌弃自己的代码按流程执行慢,爬虫效率低,推介使用简单模板单线程变多线程,效率翻倍,按需使用线程的数量可以达到意想不到的效果.

定义 

        多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理” [1]  。

1、使用线程可以把占据时间长的程序中的任务放到后台去处理 [4]  

2、用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 [4]  。

3、程序的运行速度可能加快 [4]  。

4、在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等 [4]  。

5、多线程技术在IOS软件开发中也有举足轻重的作用 [4]  。

缺点

1、如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换 [4]  。

2、更多的线程需要更多的内存空间 [4]  。

3、线程可能会给程序带来更多“bug”,因此要小心使用 [4]  。

4、线程的中止需要考虑其对程序运行的影响 [4]  。

5、通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生 [4]  。

优势

多进程程序结构和多线程程序结构有很大的不同,多线程程序结构相对于多进程程序结构有以下的优势: [5] 

1、方便的通信和数据交换

线程间有方便的通信和数据交换机制。对于不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其他线程所用,这不仅快捷,而且方便 [5]  。

2、更高效地利用CPU

使用多线程可以加快应用程序的响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作置于一个新的线程,就可以避免这种尴尬的情况 [5]  。

同时,多线程使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。

来源:百度百科

下面是效果图,使用单线程和多线程效果很明显,只需耐心读完本章,你也可以随心所欲使用多线程爬虫了.

 

 

首先使用down模拟常规爬虫,代码如下,重上到下按步骤执行.

import random
import time

def down(file_name):
    sleep_time = random.randint(2,5)
    print('开始下载:' +  file_name)
    time.sleep(sleep_time)
    print('下载完毕:' + file_name)


def sim():
    for uid in range(3):
        down('file{}'.format(uid+1))

if __name__ == '__main__':
    start = time.time()
    sim()
    end = time.time()
    print('共耗时:%ds' %  round(end-start))

加入多线程只需要这样修改即可.

import random
import time
from threading import Thread


def down(file_name):
    sleep_time = random.randint(2,5)
    print('开始下载:' +  file_name)
    time.sleep(sleep_time)
    print('下载完毕:' + file_name)


def sim():
    for uid in range(3):
        down('file{}'.format(uid+1))


def more():
    # 放线程的数组
    threads = [] 
    # 创建2个线程
    for uid in range(2):
        # 注意俩个 temp_t 都可以生成线程
        temp_t = Thread(target=down,args=( 'file{}'.format(uid + 1), ))
        temp_t = Thread(target=down('file{}'.format(uid + 1)) ) 
        threads.append(temp_t)
        temp_t.start()
    
    for t in threads:
        t.join()


if __name__ == '__main__':
    start = time.time()
    more()
    end = time.time()
    print('多线程共耗时:%ds' %  round(end-start))

完整代码:

import random
import time
from threading import Thread


def down(file_name):
    sleep_time = random.randint(2,5)
    print('开始下载:' +  file_name)
    time.sleep(sleep_time)
    print('下载完毕:' + file_name)


def sim():
    for uid in range(3):
        down('file{}'.format(uid+1))


def more():
    threads = [] # 放线程的数组
    # 创建2个线程
    for uid in range(2):
        temp_t = Thread(target=down,args=( 'file{}'.format(uid + 1), ))
        threads.append(temp_t)
        temp_t.start()

    for t in threads:

        t.join()


if __name__ == '__main__':
    start = time.time()
    sim()
    end = time.time()
    print('单线程共耗时:%ds' %  round(end-start))

    start = time.time()
    more()
    end = time.time()
    print('多线程共耗时:%ds' %  round(end-start))

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值