这篇文章主要讲解了“什么是Python异步爬虫多线程与线程池”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是Python异步爬虫多线程与线程池”吧!
背景
异步爬虫方式
多线程,多进程(不建议)
线程池,进程池(适当使用)
单线程+异步协程(推荐)
多线程
线程池
当对多个url发送请求时,只有请求完第一个url才会接着请求第二个url(requests是一个阻塞的操作),存在等待的时间,这样效率是很低的。那我们能不能在发送请求等待的时候,为其单独开启进程或者线程,继续请求下一个url,执行并行请求
好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步会执行
弊端:不能无限制开启多线程或者多进程(需要频繁的创建或者销毁进程,线程)
好处:可以降低系统对进程或线程创建和销毁的频率,从而很好的而降低系统的开销
弊端:线程或进程池中的数量是有上限的
正常运行如下的代码,需要花费8秒钟的时间,因为sleep是一个阻塞的操作,在等待的时候不会执行别的操作,极大地降低了效率
from time import sleep import time start = time.time() def xx(str): print('正在下载:', str) sleep(2) str = ['xiaozi', 'aa', 'bb', 'cc'] for i in str: xx(i) end = time.time() print('程序运行时间:',end-start)
使用多线程后
from threading import Thread from time import sleep import time start = time.time() def xx(str): print('正在下载:',str) sleep(2) str = ['xiaozi','aa','bb','cc'] def main(): for s in str: #开启线程,target=函数名,args=(xx,) ,xx为向函数传递的参数,必须为元组类型,所以后面需要加, t = Thread(target=xx,args=(s,)) t.start() if __name__ == '__main__': main() end = time.time() print('程序运行时间:',end-start)
但是我们发现下面的运行顺序貌似有点乱的
对上面的改为线程池后运行
#倒入线程池模块对应的类 from multiprocessing.dummy import Pool from time import sleep import time start = time.time() def xx(str): print('正在下载:',str) sleep(2) str = ['xiaozi','aa','bb','cc'] #实例化一个线程池对象,线程池中开辟四个线程对象,并行4个线程处理四个阻塞操作 pool = Pool(4) #将列表中的每一个列表元素(可迭代对象)传递给xx函数(发生阻塞的操作)进行处理 #map方法会有一个返回值为函数的返回值(一个列表),但是这里没有返回值所以不考虑 #调用map方法 pool.map(xx,str) end = time.time() print('程序运行时间:',end-start)
感谢各位的阅读,以上就是“什么是Python异步爬虫多线程与线程池”的内容了,经过本文的学习后,相信大家对什么是Python异步爬虫多线程与线程池这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。