python实现异步的几种方式,python异步是什么意思

  python实现异步的几种方式,python异步是什么意思

  我们知道,CPU比磁盘、网络等IO快很多。在一个线程中,CPU执行代码的速度极快。但是,一旦遇到IO操作,比如读写文件和发送网络数据,就需要等待IO操作完成后再进行下一步。这种情况称为同步IO。

  在IO操作的过程中,当前线程被挂起,而其他需要CPU执行的代码不能被当前线程执行。

  因为一个IO操作阻塞了当前线程,其他代码无法执行,所以必须使用多线程或者多进程并发执行代码,服务多个用户。每个用户将被分配一个线程。如果IO导致线程挂起,其他用户的线程不会受到影响。

  多线程多进程模型虽然解决了并发问题,但是系统不能无限制的添加线程。因为系统切换线程的开销也很大,一旦线程数量过大,CPU的时间都花在线程切换上,真正运行代码的时间就少了,导致性能严重下降。

  因为我们要解决的问题是CPU的高速执行能力和IO设备的龟速严重不匹配,多线程多进程只是解决这个问题的一种方式。

  解决IO问题的另一种方法是异步IO。当一个代码需要执行一个耗时的IO操作时,它只发出IO指令,不等待IO结果,然后去执行其他代码。一段时间后,当IO返回结果时,会通知CPU进行处理。

  1) aiohttp

  AsyncIO可以实现单线程并发IO操作。如果只是用在客户端,发挥不了多大威力。如果在服务器端使用asyncio,比如Web服务器,由于HTTP连接是一个io操作,所以可以用单线程协程实现多用户高并发支持。

  Asyncio实现了TCP、UDP、SSL等协议,而aiohttp是基于asyncio的http框架。

  安装:

  pip安装aiohttp示例:

  使用aiohttp构建web服务

  进口异步

  从aiohttp导入web

  异步定义索引(请求):

  等待异步睡眠(0.5)

  返回web。响应(body=Index )

  异步定义hello(请求):

  等待异步睡眠(0.5)

  text=hello,%s % request.match_info[name]

  返回web。response(body=text . encode( utf-8 ),content_type=text/html )

  异步定义初始化(循环):

  app=web。应用程序(循环=循环)

  app.router.add_route(GET ,/,index)

  app.router.add_route(GET ,/hello/{name} ,hello)

  SRV=await loop . create _ server(app . make _ handler(), 0.0.0.0 ,6000)

  打印(“服务器开始于http://0.0.0.0:6000”)

  返回srv

  loop=asyncio.get_event_loop()

  loop . run _ until _ complete(init(loop))

  Loop.run_forever()此时可以通过地址访问这个web服务。

  注意aiohttp的初始化函数init()也是一个协程,loop.create_server()使用asyncio创建TCP服务。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

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