异步处理怎么做性能测试,cpu异步和同步

  异步处理怎么做性能测试,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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: