最近在学习爬虫,对于线程、进程、多线程、多进程、协程研究了很多。因为我用的是WIN7,所以一切都是在win下实现的。
在WIN下使用多进程的包multiprocessing(这是第三方包,不是模块),它有几个类:Process要在终端下运行,IDLE运行不了;
同样的Pool(进程池)的map函数和Process一样要在终端运行。但奇怪的是Pool 的apply_async(异步执行)却可以在IDLE下运行,终端却没输出。
具体原因在慢慢了解,之后再更新吧。
代码如下:
#用进程池异步下载30个URL,和前一篇作比较
import random
import time
import requests
from multiprocessing import Pool
def down(url):
s=requests.Session()
res=s.get(url)
a=random.randint(0,40)
f=open('%d.jpg'%a,'wb')
f.write(res.content)
def main():
f=open('E:\Python\py\process+xiec\\test.txt','r')
a=f.readlines()
po=Pool(3)
for i in a:
po.apply_async(down,(i,))
po.close()#进程池一定要先关在join
po.join()
if __name__=='__main__':
s=time.time()
main()
e=time.time()
print(e-s)
运行时间是:8.9330(对于30个URL来说,有点丧心病狂了,我在看看吧,这只是给大家借鉴下)
最后要注意的是,在win下使用多进程时,要有入口(if __name__=='__main__':),Pool要包装在函数内,再调用。
这是我自己的了解,可能还有不全面的地方,望大家多多包涵。