千家信息网

Python异步IO怎么理解

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"Python异步IO怎么理解",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Python异步IO怎么理解"吧!Python 3.4标
千家信息网最后更新 2026年11月02日Python异步IO怎么理解

这篇文章主要讲解了"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怎么理解这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

学习 服务器 服务 内容 功能 工具 标准 模块 目标 示例 测试 实用 强大 从容 代码 兼容性 功能强大 参数 只需 可能性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 新华互联网科技学校 互联网核心科技是什么 互联网金融 科技 互联网与新科技 苏州大垚互联网科技 郑州华宇互联网科技 海南购全球互联网科技 济南和联互联网科技有限公司 农村开互联网科技讲堂 栖莱科技互联网股份有限公司 赶超互联网科技 微信多开 互联网科技革命什么开始 玉溪互联网科技怎么选 哈尔滨屹滨互联网科技有限公司 国大互联网教育科技有限公司工作 天津腾达互联网科技有限公司 中科明德北京互联网科技 南通创西澳互联网科技有限公司 云南省自由互联网科技有限公司 中国互联网公司的科技投入 礼当家互联网科技 紫鲸互联网科技 互联网科技公司有哪些 科技伦理 互联网公司 深圳市运趣互联网科技有限公司 花神(南京)互联网科技有限公司 深圳艾果互联网通讯科技 互联网科技包装股 陕西彩京云互联网科技有限公司 互联网科技创业计划的风险分析
0