最近一直在学习爬虫的相关知识,目前学习到了单线程、多线程这一块,把自己的学习经历分享出来顺便也做个笔记。
一.单线程操作
单线程操作就是我们日常写代码时的操作,为了比较出和多线程的区别,以下为其对比。
#使用单线程串行方式执行
import time
def get_page(str):
print('正在下载:',str)
time.sleep(2)
print('下载成功:',str)
name_list = ['xiaozi','aa','bb','cc']
start_time = time.time()
for i in range(len(name_list)):
get_page(name_list[i])
end_time = time.time()
print('%d second' % (end_time-start_time))
正在下载: xiaozi
下载成功: xiaozi
正在下载: aa
下载成功: aa
正在下载: bb
下载成功: bb
正在下载: cc
下载成功: cc
8 second
二.多线程操作
首先引入多线程模块
from multiprocessing.dummy import Pool
之后还是与上方大致相同。
def get_page(str):
print('正在下载:',str)
time.sleep(2)
print('下载成功:',str)
name_list = ['xiaozi','aa','bb','cc']
start_time = time.time()
其次,要实例化一个线程池
pool = Pool(4)#这里的4是4个线程
pool.map(get_page,name_list) #函数与可迭代对象
end_time = time.time()
print('%d second' % (end_time-start_time))
运行之后可以发现
正在下载: xiaozi
正在下载: aa
正在下载: bb
正在下载: cc
下载成功: xiaozi
下载成功: aa
下载成功: cc
下载成功: bb
2 second
速度明显提升。但利用这种多线程处理的方法也是有一定的缺陷,线程池中的线程或进程的数量有上限。
下面是多线程的代码:
from multiprocessing.dummy import Pool
def get_page(str):
print('正在下载:',str)
time.sleep(2)
print('下载成功:',str)
name_list = ['xiaozi','aa','bb','cc']
start_time = time.time()
pool = Pool(4)#这里的4是4个线程
pool.map(get_page,name_list) #函数与可迭代对象
end_time = time.time()
print('%d second' % (end_time-start_time))
目前我个人来说使用的方式一般是单线程+异步协程。
感谢阅读!!!
多说一句,很多人学Python过程中会遇到各种烦恼问题,没有人解答容易放弃。小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。