网络请求库
https://github.com/ydf0509/nb_http_client
pip3 install nb_http_client
线程池 + requests 390次每秒
线程池 + requests 同一个session 420次每秒
线程池 + urllib3 1070次每秒
线程池 + nb_http_client 2500次每秒,
(最新的笔记本cpu amd r7 5800H 4.2ghz 单核可以达到5100次每秒。)
asyncio + aiohttp 1480次每秒
线程池 + pycurl 30次每秒
线程池+请求客户端
import typing
from http.client import HTTPConnection
import time
import decorator_libs
import requests
import urllib3
import pycurl
from io import BytesIO
from nb_http_client import ObjectPool, HttpOperator
from threadpool_executor_shrink_able import BoundedThreadPoolExecutor
http_pool = ObjectPool(object_type=HttpOperator, object_pool_size=50, object_init_kwargs=dict(host='127.0.0.1', port=5678),
max_idle_seconds=30)
requests_session = requests.session()
urllib3_pool = urllib3.PoolManager(100)
thread_pool = BoundedThreadPoolExecutor(50)
def test_by_requets():
# 这个连接池是requests性能5倍。 headers = {'Connection':'close'} 为了防止频繁报错 OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
resp = requests.get('http://127.0.0.1:5678/', headers={'Connection': 'close'})
print(resp.text)
def test_by_requests_session():
resp = requests_session.get('http://127.0.0.1:5678/', headers={'Connection': 'close'})
print(resp.text)
def test_by_urllib3():
resp = urllib3_pool.request('get', 'http://127.0.0.1:5678/', headers={'Connection': 'close'}) # urllib3 第二快,次代码手动实现的http池是第一快。
print(resp.data)
def test_by_pycurl():
# 这个号称c库,性能是最差的
buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'http://127.0.0.1:5678/')
c.setopt(c.WRITEDATA, buffer)
c.perform()
c.close()
body = buffer.getvalue()
print(body.decode())
def test_by_nb_http_client():
with http_pool.get() as conn: # type: typing.Union[HttpOperator,HTTPConnection] # http对象池的请求速度暴击requests的session和直接requests.get
r1 = conn.request_and_getresponse('GET', '/')
print(r1.text[:10], )
if __name__ == '__main__':
with decorator_libs.TimerContextManager():
for x in range(30000):
# time.sleep(5) # 这是测试是否是是智能节制新建对象,如果任务不密集,不需要新建那么多对象。
thread_pool.submit(test_by_pycurl, ) # TOOD 这里换成不同的函数来测试,然后在控制台搜索时分秒就能看到每一秒的响应个数了。
thread_pool.shutdown()
time.sleep(10000) # 这个可以测试nb_http_client的连接长时间不使用,能自动摧毁
线程池
最好的python线程池,可以实现线程池自动缩小
https://github.com/ydf0509/threadpool_executor_shrink_able
pip3 install threadpool_executor_shrink_able
控频线程池
https://github.com/ydf0509/tps_threadpool_executor
pip3 install tps_threadpool_executor
4种控频线程池
TpsThreadpoolExecutor 基于单进程的当前线程池控频。
DistributedTpsThreadpoolExecutor 基于多台机器的分布式控频,需要安装redis,统计出活跃线程池,从而平分任务。
TpsThreadpoolExecutorWithMultiProcess 基于单机 多进程 + 智能线程池 的控频率,自动开启多进程,适合单台电脑但cpu核心多。
DistributedTpsThreadpoolExecutorWithMultiProcess 基于多机的,每台机器自动开多进程 + 多线程 的控频率,适合多态电脑,但每台电脑的cpu核数不够强大。
IP代理池
https://github.com/ydf0509/proxypool_framework
pip3 install proxypool_framework
proxypool_framework 是通用ip代理池架构 + 内置的20+ 个免费代理ip网站爬取函数。
从ip数量、ip质量、代理池实现本身的难度和代码行数、代理池扩展平台需要的代码行数和难度、
配置方式、代理检测设计算法,是py史上最强的代理池,欢迎对比任意项目代理池项目,
如果这不是最强的,可以写出理由反驳,并贴出更好代码的地址。
评论区