广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python异步IO怎么理解
  • 662
分享到

Python异步IO怎么理解

2023-06-17 02:06:22 662人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要讲解了“python异步io怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python异步IO怎么理解”吧!Python 3.4标准库有一个新模块asyncio,用来支持

这篇文章主要讲解了“python异步io怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python异步IO怎么理解”吧!

Python 3.4标准库有一个新模块asyncio,用来支持异步IO,不过目前api状态是provisional,意味着不保证向后兼容性,甚至可能从标准库中移除(可能性极低)。如果关注PEP和Python-Dev会发现该模块酝酿了很长时间,可能后续有API和实现上的调整,但毋庸置疑asyncio非常实用且功能强大,值得学习和深究。

示例

asyncio主要应对tcp/UDP Socket通信,从容管理大量连接,而无需创建大量线程,提高系统运行效率。此处将官方文档的一个示例做简单改造,实现一个Http长连接benchmark工具,用于诊断WEB服务器长连接处理能力。

功能概述:

每隔10毫秒创建10个连接,直到目标连接数(比如10k),同时每个连接都会规律性的向服务器发送HEAD请求,以维持HTTP keepavlie。

代码如下: 

import argparse  import asyncio  import functools  import logging  import random  import urllib.parse  loop = asyncio.get_event_loop()  @asyncio.coroutine  def print_http_headers(no, url, keepalive):      url = urllib.parse.urlsplit(url)      wait_for = functools.partial(asyncio.wait_for, timeout=3, loop=loop)      query = ('HEAD {url.path} HTTP/1.1\r\n'               'Host: {url.hostname}\r\n'               '\r\n').fORMat(url=url).encode('utf-8')      rd, wr = yield from wait_for(asyncio.open_connection(url.hostname, 80))      while True:          wr.write(query)          while True:              line = yield from wait_for(rd.readline())              if not line: # end of connection                  wr.close()                  return no              line = line.decode('utf-8').rstrip()              if not line: # end of header                  break              logging.debug('(%d) HTTP header> %s' % (no, line))          yield from asyncio.sleep(random.randint(1, keepalive//2))  @asyncio.coroutine  def do_requests(args):      conn_pool = set()      waiter = asyncio.Future()      def _on_complete(fut):          conn_pool.remove(fut)          exc, res = fut.exception(), fut.result()          if exc is not None:              logging.info('conn#{} exception'.format(exc))          else:              logging.info('conn#{} result'.format(res))          if not conn_pool:              waiter.set_result('event loop is done')      for i in range(args.connections):          fut = asyncio.async(print_http_headers(i, args.url, args.keepalive))          fut.add_done_callback(_on_complete)          conn_pool.add(fut)          if i % 10 == 0:              yield from asyncio.sleep(0.01)      logging.info((yield from waiter))  def main():      parser = argparse.ArgumentParser(description='asyncli')      parser.add_argument('url', help='page address')      parser.add_argument('-c', '--connections', type=int, default=1,                          help='number of connections simultaneously')      parser.add_argument('-k', '--keepalive', type=int, default=60,                          help='HTTP keepalive timeout')      args = parser.parse_args()      logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')      loop.run_until_complete(do_requests(args))      loop.close()  if __name__ == '__main__':      main()

测试与分析

硬件:CPU 2.3GHz / 2 cores,RAM 2GB

软件:Centos 6.5(kernel 2.6.32), Python 3.3 (pip install asyncio), Nginx 1.4.7

参数设置:ulimit -n 10240;nginx worker的连接数改为10240

启动WEB服务器,只需一个worker进程:

# ../sbin/nginx  # ps ax | grep nginx  2007 ? Ss 0:00 nginx: master process ../sbin/nginx  2008 ? S 0:00 nginx: worker process

启动benchmark工具, 发起10k个连接,目标URL是nginx的默认测试页面:

$ python asyncli.py http://10.211.55.8/ -c 10000

nginx日志统计平均每秒请求数:

# tail -1000000 access.log | awk '{ print $4 }' | sort | uniq -c | awk '{ cnt+=1; sum+=$1 } END { printf "avg = %d\n", sum/cnt }'  avg = 548

top部分输出:

VIRT   RES   SHR  S %CPU  %MEM   TIME+  COMMAND  657m   115m  3860 R 60.2  6.2   4:30.02  python  54208  10m   848  R 7.0   0.6   0:30.79  nginx

感谢各位的阅读,以上就是“Python异步IO怎么理解”的内容了,经过本文的学习后,相信大家对Python异步IO怎么理解这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Python异步IO怎么理解

本文链接: https://www.lsjlt.com/news/286916.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python异步IO怎么理解
    这篇文章主要讲解了“Python异步IO怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python异步IO怎么理解”吧!Python 3.4标准库有一个新模块asyncio,用来支持...
    99+
    2023-06-17
  • 一步步理解python的异步IO
      分享至:一步步理解python的异步IO 前言 看到越来越多的大佬都在使用python的异步IO,协程等概念来实现高效的IO处理过程,可是我对这些概念还不太懂,就学习了一下。 因为是初学者,在理解上有很多不到位的地方,如果有错误,还希...
    99+
    2023-01-31
    python IO
  • python中异步IO怎么同时处理请求
    小编给大家分享一下python中异步IO怎么同时处理请求,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python主要应用领域有哪些1、云计算,典型应用OpenS...
    99+
    2023-06-14
  • 怎么在python中利用asyncio实现异步IO
    这篇文章给大家介绍怎么在python中利用asyncio实现异步IO,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌...
    99+
    2023-06-14
  • Python笔记-IO同步和异步、 读写
    IO:Input/Output 由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题。举个例子来说,比如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可是磁盘要接收这10...
    99+
    2023-01-31
    笔记 Python IO
  • JavaScript异步怎么理解
    本篇内容主要讲解“JavaScript异步怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript异步怎么理解”吧! 导读 首先,要知道J...
    99+
    2022-10-19
  • python之事件驱动与异步IO
      写服务器处理模型的程序时,通常有以下几种模型:  1.每收到一个请求,创建一个新的进程来处理该请求  2.每收到一个请求,创建一个新的线程来处理该请求  3.每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求(协程...
    99+
    2023-01-31
    事件 python IO
  • 怎么理解异步编程RxJava
    这篇文章给大家介绍怎么理解异步编程RxJava,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言前段时间写了一篇对协程的一些理解,里面提到了不管是协程还是callback,本质上其实提供的是一种异步无阻塞的编程模式;并...
    99+
    2023-06-17
  • React Suspense前后端IO异步操作处理
    目录简单介绍SuspenseSuspense主要用法和场景一. React18之前的做法二. React18之后Suspense配合前端表格组件处理前后端IO异步操作简单介绍Susp...
    99+
    2022-11-13
  • Python高级编程和异步IO并发编程
    Python高级编程和异步IO并发编程网盘地址:https://pan.baidu.com/s/1eB-BsUacBRhKxh7qXwndMQ 密码: tgba备用地址(腾讯微云):https://share.weiyun.com/5Z3x...
    99+
    2023-01-31
    高级编程 Python IO
  • 带你了解Nodejs中的非阻塞异步IO
    以上就是带你了解Nodejs中的非阻塞异步IO的详细内容,更多请关注编程网其它相关文章!...
    99+
    2023-05-14
    I/O模型 node
  • python异步回调怎么写
    在Python中,可以使用asyncio库来实现异步回调。下面是一个简单的示例,演示如何使用异步回调:pythonimport as...
    99+
    2023-10-19
    python
  • oracle异步IO中的filesystemio_options参数是怎样的
    本篇文章给大家分享的是有关oracle异步IO中的filesystemio_options参数是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看...
    99+
    2022-10-19
  • Nodejs中的非阻塞异步IO是什么
    这篇文章主要讲解了“Nodejs中的非阻塞异步IO是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Nodejs中的非阻塞异步IO是什么”吧!我们以网络请求IO为例,首先介绍服务端处理一次...
    99+
    2023-07-04
  • Innodb关键特性之什么是异步IO
    这篇文章主要介绍“Innodb关键特性之什么是异步IO”,在日常操作中,相信很多人在Innodb关键特性之什么是异步IO问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Inno...
    99+
    2022-10-18
  • Java的IO系统怎么理解
    这篇文章将为大家详细讲解有关Java的IO系统怎么理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1 以字节为导向的stream以字节为导向的stream,表示以字节为单位从stream中...
    99+
    2023-06-03
  • Python中怎么实现同步和异步
    Python中怎么实现同步和异步,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、同步与异步#同步编程(同一时间只能做一件事,做完了才能做下一件事情) ...
    99+
    2023-06-17
  • JavaScript中怎么处理异步
    JavaScript中怎么处理异步,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、回调函数回调是一个函数被作为一个参数传递到另一个函数里,在...
    99+
    2022-10-19
  • React Suspense前后端IO异步操作处理的方法
    这篇文章主要讲解了“React Suspense前后端IO异步操作处理的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React Suspense前后端IO异步操作处...
    99+
    2023-07-02
  • C#异步委托和多线程怎么理解
    这篇文章主要讲解了“C#异步委托和多线程怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#异步委托和多线程怎么理解”吧!关于这个问题,我想很多初学者跟我一样有很多疑问吧。下面我说的内...
    99+
    2023-06-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作