爬虫(性能相关)

多进程和多进程在何种情况下使用
IO密集型用多线程,爬虫就是IO密集型
计算密集型用多进程
wusir爬虫链接

多线程请求(多进程类似)

from concurrent.futures import ThreadPoolExecutor
import requests
import time


def func(url):
    response = requests.get(url)
    print(url, response)
    return response


def done(future):
    response = future.result()
    print(response.status_code)


url_lst = [
    'https://www.cnblogs.com/',
    'http://www.baidu.com',
    'http://www.sohu.com',
    'https://www.sogou.com',
]

tpool = ThreadPoolExecutor(max_workers=5)

for url in url_lst:
    v = tpool.submit(func,url)
    v.add_done_callback(done)
tpool.shutdown(wait=True)

使用协程+异步IO

asyncio
asyncio模块:(需要自己封装Http数据包)
aiohttp模块:(这个模块封装了http数据包)
方法一:asyncio + aiohttp
方法二:asyncio + requests

gevent
方法一:gevent + requests
方法二:gevent(协程池,对多法多少个请求) + requests from gevent.pool import Pool
方法三:gevent + requests → grequests(合成模块) pip install grequests

Twisted
pip3 install twisted

Tornado
pip3 install tornado

排名:gevent——Twisted——Tornado——asyncio

自定义异步IO模块

1、socket客户端,服务端,是阻塞的
设置成非阻塞 setbloking(False) ,当链接无响应时就会报错

2、IO多路复用
r_lst, w_lst, x_lst, = select.select([skobj], [], [])
r[skobj] # 表示有人给我发送数据
w[skobj] # 表示我已经和别人创建链接成功
x[skobj] # 表示发生异常的sk对象

3、r_lst, w_lst, x_lst, = select.select([skobj], [], [])
参数列表里面不一定要是sk对象,但对象必须有:fileno方法,并返回一个文件描述符

IO多路复用
select模块
r,w,e = while 监听多个socket对象;利用其特性开发异步IO模块。

异步IO
非阻塞的socket + IO多路复用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值