异步处理怎么做性能测试,cpu异步和同步
在编写爬虫时,性能的消耗主要在超正析象管(图片Orthicon)请求中,当单进程单线程模式下请求统一资源定位器时必然会引起等待,从而使得请求整体变慢。
导入请求
定义获取_异步(url):
response=requests.get(url)
返回响应
url_list=[http://www.github.com , http://www.bing.com]
对于url_list中的网址:
获取_异步(网址)
1.同步执行同步
可以实现并发
但是,请求发送出去后和返回之前,中间时期线程空闲
编写方式:
-直接返回处理
-通过回调函数处理
########### 编写方式一###########
从并行未来导入线程池执行器
导入请求
导入时间
定义任务(网址):
response=requests.get(url)
打印(网址,响应)
# 写正则表达式
pool=ThreadPoolExecutor(7)
url_list=[
http://www .***. com/wupeiqi ,
http://huaban.com/favorite/beauty/,
http://www.bing.com,
http://www.zhihu.com,
http://www.sina.com,
http://www.baidu.com,
http://www.autohome.com.cn,
]
对于url_list中的网址:
池.提交(任务,网址)
pool.shutdown(wait=True)
########### 编写方式二###########
从并行未来导入线程池执行器
导入请求
导入时间
定义任务(网址):
下载页面
:参数网址:
:返回:
response=requests.get(url)
返回响应
def done(future,*args,*kwargs):
response=future.result()
打印(response.status_code,response.content)
pool=ThreadPoolExecutor(7)
url_list=[
http://www .***. com/wupeiqi ,
http://huaban.com/favorite/beauty/,
http://www.bing.com,
http://www.zhihu.com,
http://www.sina.com,
http://www.baidu.com,
http://www.autohome.com.cn,
]
对于url_list中的网址:
v=pool.submit(任务,网址)
五。添加完成回调(完成)
pool.shutdown(wait=True)多线程执行
可以实现并发
但是,请求发送出去后和返回之前,中间时期进程空闲
编写方式:
-直接返回处理
-通过回调函数处理
########### 编写方式一###########
从并行未来导入进程池执行器
导入请求
导入时间
定义任务(网址):
response=requests.get(url)
打印(网址,响应)
# 写正则表达式
pool=ProcessPoolExecutor(7)
url_list=[
http://www .***. com/wupeiqi ,
http://huaban.com/favorite/beauty/,
http://www.bing.com,
http://www.zhihu.com,
http://www.sina.com,
http://www.baidu.com,
http://www.autohome.com.cn,
]
对于url_list中的网址:
池.提交(任务,网址)
pool.shutdown(wait=True)
########### 编写方式二###########
从并行未来导入进程池执行器
导入请求
导入时间
定义任务(网址):
response=requests.get(url)
返回响应
def done(future,*args,*kwargs):
response=future.result()
打印(response.status_code,response.content)
pool=ProcessPoolExecutor(7)
url_list=[
http://www .***. com/wupeiqi ,
http://huaban.com/favorite/beauty/,
http://www.bing.com,
http://www.zhihu.com,
http://www.sina.com,
http://www.baidu.com,
http://www.autohome.com.cn,
]
对于url_list中的网址:
v=pool.submit(任务,网址)
五。添加完成回调(完成)
pool.shutdown(wait=True)多进程
进口异步
@asyncio.coroutine
定义任务():
打印(之前.任务.)
屈服于asyncio.sleep(5) #发送超文本传送协议(超文本传输协议的缩写)请求,支持三氯苯酚获取结果.
打印(结束.任务.)
tasks=[task(),task()]
loop=asyncio.get_event_loop()
循环。run _ until _ complete(asyncio。收集(*任务))
loop.close()
进口异步
@asyncio.coroutine
定义任务(主机,url=/):
打印(开始,主机,网址)
读者,作者=从asyncio获得。open _ connection(主机,80)
request _ header _ content= GET % s HTTP/1.0 \ r \ n主机:% s \ r \ n \ r \ n %(URL,Host,)
请求标题内容=字节(请求标题内容,编码=utf-8 )
writer.write请求标题内容)
writer.drain的产量()
文本=来自读者.阅读的产量()
打印(结束,主机,网址,文本)
writer.close()
任务=[
任务( www .***.com ,/wupeiqi/),
task(dig.chouti.com ,/pic/show?NID=4073644713430508 lid=10273091’)
]
loop=asyncio.get_event_loop()
结果=循环。run _ until _ complete(asyncio。收集(*任务))
loop.close()
进口实现
进口异步
@asyncio.coroutine
定义获取_异步(url):
打印(网址)
response=aiohttp。请求的yield( GET ,url)
打印(网址,响应)
response.close()
tasks=[fetch _ async( http://www。百度一下。com/),fetch _ async( http://www。乔蒂。com/)]
event _ loop=asyncio。get _ event _ loop()
结果=事件循环。run _ until _ complete(asyncio。收集(*任务))
event_loop.close()
进口异步
导入请求
@asyncio.coroutine
定义任务(func,*args):
打印(函数,参数)
loop=asyncio.get_event_loop()
未来=循环。run _ in _ executor(None,func,*args) # requests.get(http://www。***.com/wupeiqi/)
响应=未来收益
打印(响应. url,响应.内容)
任务=[
task(requests.get, http://www .***.com/wupeiqi/),
task(requests.get, http://dig.chouti.com/pic/show?NID=4073644713430508 lid=10273091’)
]
loop=asyncio.get_event_loop()
结果=循环。run _ until _ complete(asyncio。收集(*任务))
loop.close()asyncio
导入事件
导入请求
从命名空间进口猴子
monkey.patch_all()
定义任务(方法,url,req_kwargs):
打印(方法,url,req_kwargs)
响应=请求.请求(方法=方法,url=url,**req_kwargs)
打印(响应. url,响应.内容)
# ##### 发送请求#####
# gevent.joinall([
# gevent.spawn(task,method=get ,url=https://www.python.org/,req_kwargs={}),
# gevent.spawn(task,method=get ,url=https://www.yahoo.com/,req_kwargs={}),
# gevent.spawn(task,method=get ,url=https://github.com/,req_kwargs={}),
# ])
# ##### 发送请求(协程池控制最大协程数量) #####
从gevent.pool导入池
池=池(5)
gevent.joinall([
pool.spawn(task,method=get ,url=https://www.python.org/,req_kwargs={}),
pool.spawn(task,method=get ,url=https://www.yahoo.com/,req_kwargs={}),
pool.spawn(task,method=get ,url=https://www.github.com/,req_kwargs={}),
])
导入请求
导入请求
请求列表=[
grequests。get( http://http bin。org/delay/1 ,超时=0.001),
grequests。get( http://假域名/),
grequests。get( http://http bin。组织/状态/500’)
]
# ##### 执行并获取响应列表#####
response _ list=grequests。映射(请求列表,大小=5)
打印(响应列表)事件
#!/usr/bin/env python
# -*-编码:utf-8 -*-
从扭曲的互联网导入延迟
从twisted.web.client导入获取页面
从扭曲的互联网导入反应器
def one_done(参数):
打印(参数)
定义全部完成(参数):
打印("完成")
反应器。停止()
@defer.inlineCallbacks
定义任务(网址):
res=getPage(bytes(url,encoding= utf8 )#发送超文本传送协议(超文本传输协议的缩写)请求
res.addCallback(one_done)
产量研究
url_list=[
http://www .***. com ,
http://www .***. com ,
http://www .***. com ,
http://www .***. com ,
]
defer_list=[] # [特殊,特殊,特殊(已经向全球资源定位器(统一资源定位器)发送请求)]
对于url_list中的网址:
v=任务(网址)
defer_list.append
d=延期DeferredList(defer_list)
d.addBoth(all_done)
反应器。运行()#死循环扭曲的
#!/usr/bin/env python
# -*-编码:utf-8 -*-
从龙卷风. httpclient导入异步客户端
从龙卷风. httpclient导入对象
从龙卷风导入ioloop
计数=0
定义句柄_响应(响应):
全局计数
计数-=1
如果响应错误:
print(Error:,response.error)
否则:
打印(响应。正文)
# 方法同扭曲的
# ioloop .IOLoop.current().停止()
如果计数==0:
ioloop .IOLoop.current().停止()
定义函数():
url_list=[
http://www.baidu.com,
http://www.bing.com,
]
全局计数
COUNT=len(url_list)
对于url_list中的网址:
打印(网址)
http_client=AsyncHTTPClient()
http _ client。fetch(http请求(URL),handle_response)
ioloop .IOLoop.current().添加回调函数
ioloop .IOLoop.current().start() #死循环龙卷风
最牛逼自定义异步超正析象管框架
导入插座
导入选择
################ HTTP请求本质,阻塞##########################
sk=socket.socket()
# 1.连接
sk.connect((www.baidu.com ,80,)# IO阻塞
打印(连接成功了.)
# 2.连接成功发送消息
sk。send(b get/HTTP/1.0 \ r \ n主机:www。百度一下。 com \ r \ n \ r \ n )
# sk。send(b post/HTTP/1.0 \ r \ n主机:www。百度一下。com \ r \ n \ r \ nk1=v1 k2=v2 )
# 3.等待着服务端响应
data=sk.recv(8096) # IO阻塞
打印(数据)
# 关闭连接
sk.close()
################ HTTP请求本质,非阻塞##########################
sk=socket.socket()
sk.setblocking(False)
# 1.连接
尝试:
sk.connect((www.baidu.com ,80,)# IO阻塞
打印(连接成功了.)
除了阻塞误差作为e:
打印(五)
# 2.连接成功发送消息
sk。send(b get/HTTP/1.0 \ r \ n主机:www。百度一下。 com \ r \ n \ r \ n )
# sk。send(b post/HTTP/1.0 \ r \ n主机:www。百度一下。com \ r \ n \ r \ nk1=v1 k2=v2 )
# 3.等待着服务端响应
data=sk.recv(8096) # IO阻塞
打印(数据)
# 关闭连接
sk.close()
类别http请求:
def __init__(自身,sk,主机,回调):
self.socket=sk
self.host=host
self.callback=回调
定义文件号(自身):
return self.socket.fileno()
类别http响应:
def __init__(self,recv_data):
self.recv_data=recv_data
self.header_dict={}
self.body=无
self.initialize()
定义初始化(自身):
headers,body=self。recv _ data。split(b \ r \ n \ r \ n ,1)
self.body=身体
header _ list=标题。拆分(b \ r \ n )
对于header_list中的h:
h_str=str(h,encoding=utf-8 )
v=h_str.split(:,1)
如果len(v)==2:
self.header_dict[v[0]]=v[1]
类异步请求:
def __init__(self):
self.conn=[]
self.connection=[] #用于检测是否已经连接成功
定义添加请求(自身、主机、回调):
尝试:
sk=socket.socket()
sk.setblocking(0)
sk.connect(主机,80,))
除了阻塞误差作为e:
及格
request=HttpRequest(sk,host,callback)
self.conn.append(请求)
自我.连接.附加(请求)
定义运行(自身):
虽然正确:
rlist,wlist,elist=select.select(self.conn,self.connection,self.conn,0.05)
对于wlist中的女:
打印(w.host,’连接成功.)
# 只要能循环到,表示窝和服务器端已经连接成功
TPL= GET/HTTP/1.0 \ r \ n主机:% s \ r \ n \ r \ n %(w . host,)
w .套接字.发送(字节(tpl,编码=utf-8 ))
自连接。移除(w)
对于rlist中的r:
# r,是对象
recv_data=bytes()
虽然正确:
尝试:
chunck=r.socket.recv(8096)
recv_data=chunck
例外情况为e:
破裂
response=http响应(recv _ data)
r。回调(响应)
r。套接字。关闭()
自连接移除(r)
如果len(self.conn)==0:
破裂
定义f1(响应):
打印(保存到文件,response.header_dict)
定义f2(响应):
打印(保存到数据库,response.header_dict)
url_list=[
{host:www.baidu.com , callback: f1}
{host:cn.bing.com , callback: f2}
{host:www .***. com ,回调:f2},
]
req=AsyncRequest()
对于url_list中的项目:
请求添加请求(项目[主机],项目[回调])
req.run()
异步超正析象管
-傻等
响应=requests.get(.)
-机智
响应=requests.get(.)
响应=requests.get(.)
响应=requests.get(.)
响应=requests.get(.)
角色:使用者
-多线程
-多线程
-协程(微线程)异步IO=》 1个线程发送普通个超文本传送协议(超文本传输协议的缩写)请求
-阿辛西奥
-示例1:asyncio.sleep(5)
-示例2:自己封装超文本传送协议(超文本传输协议的缩写)数据包
-示例3:asyncio aiohttp
实现模块:封装超文本传送协议(超文本传输协议的缩写)数据包pip3安装实现
-示例4:异步请求
要求模块:封装超文本传送协议(超文本传输协议的缩写)数据包pip3安装请求
格林莱特异步超正析象管(图片Orthicon)
pip3安装一种绿色小鸟
pip3安装命名空间
-示例1:gevent请求
-示例2:gevent(协程池,最多发多少个请求)请求
-示例3:gevent requests=grequests
pip3安装请求
扭曲了
pip3安装扭曲
龙卷风
pip3安装龙卷风
=====gevent扭曲龙卷风异步IO
角色:NB开发者
1.窝客户端、服务端
连接阻塞
setblocking(0):无数据(连接无响应;数据未返回)就报错
2.超正析象管(图片Orthicon)多路复用
客户端:
尝试:
窝对象1 .连接()
窝对象2 .连接()
窝对象3 .连接()
除了不包括.
及格
虽然正确:
r,w,e=select.select([socket对象1、插座对象2、插座对象3、]、[插座对象1、插座对象2、插座对象3,],[],0.05)
r=[插座对象1,] # 表示有人给我发送数据
xx=插座对象1.recv()
W=[socket object 1,] #表示我已经成功创建了与他人的连接:
object 1 . send( get/index http/1.0 \ r \ n host:Baidu.com \ r \ n \ r \ n )
3.
Foo类:
def fileno(自身):
obj=套接字()
return obj.fileno()
r,w,e=select.select([socket对象?对象?对象?Foo()],[],[])
#对象必须有:fileno方法并返回文件描述符。
========
A.select internal: object.fileno()
B.Foo()在内部封装了套接字文件描述符
IO多路复用:
r,w,e=while监控多个socket对象接收到的变化,可以利用其特性进行开发。
异步IO:
非阻塞套接字IO多路复用
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。