编玩边学

>

资讯中心

>

推荐资讯

> 正文

以Python爬取数据为例,多线程和多进程的优劣

2019-08-19 来源:编玩边学

如果我们要爬取多个网站的一些数据


单线程,单进程时


只使用for循环一个个的遍历URL并读取响应,使用IPython的%%time函数统计消耗的时间。

import urllib.request

form concurrent.futures import ThreadPoolExecutor

urls=[

“https://www.codepku.com/”,

“https://www.codepku.com/informations/notice”,

“https://www.codepku.com/informations/event”,

“https://www.codepku.com/informations/offline”,

“https://www.codepku.com/informations/information”,

“https://www.codepku.com/course”,

“https://www.codepku.com/course/enlightenment”,

“https://www.codepku.com/teach”,

“http://kids.codepku.com/”,

“http://kids.codepku.com/work/list”,

“http://kids.codepku.com/hacker/tech”,

“http://kids.codepku.com/ranking/list”,

“http://kids.codepku.com/match”,

]

%%time

results=[]

for url in urls:

with urllib.request.urlopen(rul)as src:

results.append(src)

读取这些网页大概需要12秒钟。

 

多线程,比如4个线程,%%time下面的代码改为

with ThreadPoolExecutor(4)as executor:

results=executor.map(rullib.request.urlopen.urls)

这时从12秒变成3秒多,接近4秒了。

 

单进程,计算100万以内所有质数的和。

def if_prime(x):

i

f x<=1:

return 0

elif x<=3:

return x

elif x%2==0 or x%3==0:

return 0

i=5

while i**2<=x:

i

f x%i==0 or x%(i+2)==0:

return 0

i

+=6

return x

%%time

answer=0

for i in range(1000000):

answer+=if_prime(i)

耗时3.48秒钟

 

多进程

from muItiprocessing import Pool

def if_prime(x):

if x<=1:

return 0

elif x<=3:

return x

elif x%2==0 or x%3==0:

return 0

i=5

while i**2<=x:

if x%i==0 or x%(i+2)==0:

return 0

i+=6

return x

 

%%time

if __name__==‘__main__’:

with Pool(2)as p:

answer=sum(p.map(if_prime.list(range(1000000))))

 

使用2进程,耗时1.91秒钟


在数据共享、同步方面,多进程是数据共享复杂,需要用IPC,数据是分开的,同步简单。多线程因为共享进程数据,数据共享简单,但同步复杂;在内存、CPU方面,多进程占用内存多,切换复杂,CPU利用率低。多线程占用内存少,切换简单,CPU利用率高;在创建销毁、切换方面,多进程创建销毁、切换复杂,速度慢。多线程创建销毁、切换简单,速度很快;在编程、调试方面,多进程编程和调试都简单。多线程编程和调试都复杂;可靠性方面,多进程间不会互相影响。多线程中的一个线程挂掉将导致整个进程挂掉;在分布式方面,多进程适应于多核、多机分布式。多线程适应于多核分布式。


所以如果您想报名少儿编程培训课程,就请点击“少儿编程报名”,填写信息,并领取5G的免费试听课程和学习资料。  

版权及免责声明

1、"编玩边学"上的内容,包括文章、资料、资讯等,本网注明"来源:编玩边学"的,其版权均为"编玩边学"或深圳市编玩边学教育科技有限公司所有,任何公司、媒体、网站或个人未经授权不得转载、链接、转贴或以其他方式使用。已经得到"编玩边学"许可的媒体、网站,在使用时必须注明"来源:编玩边学",违者本网站将依法追究责任。

2、"编玩边学" 未注明"来源:编玩边学"的文章、资料、资讯等均为转载,本网站转载出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如其他媒体、网站或个人从本网站下载使用,必须保留本网站注明的"稿件来源",并自负版权等法律责任。如擅自篡改为" 来源:编玩边学 " ,本网站将依法追究其法律责任。

3、如果本网所转载内容侵犯了您的权益,请与我们联系team@codepku.com,我们将及时处理。