使用POOL+Queue的多进程爬虫

前面说的multiprocessing里面的Process动态生成多个进程,如果限制数量过大就繁琐了,现在就可以使用Pool进程的功效。

在使用Pool前,我们先了解一下阻塞和非阻塞两个概念。

阻塞和非阻塞关注的是程序在等待调用结果时的状态。阻塞要等到回调结果出来,在有结果之前,当前进程会被挂起。非阻塞为添加进程后,不一定非要等待结果出来就可以添加其它的进程。

我们现在开始使用Pool的非阻塞和Queue来获取网页数据:

import multiprocessing import pool,Manager
import time
import requests

link_list=[]
with open('eqwaak.txt','r') as file:
    file_list=file.readlines()
    for eachone in file_list:
        link=eachone.split('\t')[1]
        link=link.replace('\n','')
        link_list.append(link)

strat=time.time()
def crawler(q,index):
    Process_id='Process-'+str(index)
    while not q.empty():
        url=q.get(timeout=2)
        try:r=requests.get(url,timeout=20)
        print(Process_id,q.qsize(),r.status_code,url)
        except Exception as e:
        print(Process_id,q.qsize(),url,'Error',e)
        

if __name__ == '__main__':
    manager=Manager()
    workQueue=manager.Queue(1000)
    
    for url in link_list:
        workQueue.put(url)
    pool=pool(prscesses=3)
    for i in range(4):
        pool.apply_async(crawler,args=(workQueue,i))
        
    print('started ')
    pool.close()
    pool.join()
    
    end=time.time()
    print('Pool+Queue多进程爬虫的时间:',end-strat)
    print('END')

如果我们要将线程池Pool和Queue结合起来,Queue就需要改变,用到前面multiprocessing里面的Manger,使用manger=Manger()和workQueue=manager.Queue(1000)来创建列表:

pool=Pool(processe=3)
for i in range(4):
         pool.apply_async(crawler,args=(workQueue,i))

上面我们使用的是非阻塞方法,换成阻塞也简单:将pool.apply_async(target=func,args=(args)改为pool.apply(target=func,args=(args))就好了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eqwaak0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值