色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python異步IO分析

馬哥Linux運維 ? 來源:工程師曾玲 ? 2019-02-02 09:04 ? 次閱讀

異步操作在計算機軟硬件體系中是一個普遍概念,根源在于參與協作的各實體處理速度上有明顯差異。軟件開發中遇到的多數情況是CPU與IO的速度不匹配,所以異步IO存在于各種編程框架中,客戶端比如瀏覽器,服務端比如node.js。本文主要分析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。

代碼如下:

importargparse

importasyncio

importfunctools

importlogging

importrandom

importurllib.parse

loop=asyncio.get_event_loop()

@asyncio.coroutine

defprint_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=yieldfromwait_for(asyncio.open_connection(url.hostname,80))

whileTrue:

wr.write(query)

whileTrue:

line=yieldfromwait_for(rd.readline())

ifnotline:# end of connection

wr.close()

returnno

line=line.decode('utf-8').rstrip()

ifnotline:# end of header

break

logging.debug('(%d) HTTP header> %s'%(no,line))

yieldfromasyncio.sleep(random.randint(1,keepalive//2))

@asyncio.coroutine

defdo_requests(args):

conn_pool=set()

waiter=asyncio.Future()

def_on_complete(fut):

conn_pool.remove(fut)

exc,res=fut.exception(),fut.result()

ifexcisnotNone:

logging.info('conn#{} exception'.format(exc))

else:

logging.info('conn#{} result'.format(res))

ifnotconn_pool:

waiter.set_result('event loop is done')

foriinrange(args.connections):

fut=asyncio.async(print_http_headers(i,args.url,args.keepalive))

fut.add_done_callback(_on_complete)

conn_pool.add(fut)

ifi%10==0:

yieldfromasyncio.sleep(0.01)

logging.info((yieldfromwaiter))

defmain():

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

總結:

1. Python實現簡潔明了。不到80行代碼,只用到標準庫,邏輯直觀,想象下C/C++標準庫實現這些功能,頓覺“人生苦短,我用Python”。

2. Python運行效率不理想。當連接建立后,客戶端和服務端的數據收發邏輯差不多,看上面top輸出,Python的CPU和RAM占用基本都是nginx的10倍,意味著效率相差100倍(CPU x RAM),側面說明了Python與C的效率差距。這個對比雖然有些極端,畢竟nginx不僅用C且為CPU/RAM占用做了深度優化,但相似任務效率相差兩個數量級,除非是BUG,說明架構設計的出發點就是不同的,Python優先可讀易用而性能次之,nginx就是一個高度優化的WEB服務器,開發一個module都比較麻煩,要復用它的異步框架,簡直難上加難。開發效率與運行效率的權衡,永遠都存在。

3. 單線程異步IO v.s. 多線程同步IO。上面的例子是單線程異步IO,其實不寫demo就知道多線程同步IO效率低得多,每個線程一個連接?10k個線程,僅線程棧就占用600+MB(64KB * 10000)內存,加上線程上下文切換和GIL,基本就是噩夢。

ayncio核心概念

以下是學習asyncio時需要理解的四個核心概念,更多細節請看<參考資料>

1. event loop。單線程實現異步的關鍵就在于這個高層事件循環,它是同步執行的。

2. future。異步IO有很多異步任務構成,而每個異步任務都由一個future控制。

3. coroutine。每個異步任務具體的執行邏輯由一個coroutine來體現。

4. generator(yield & yield from) 。在asyncio中大量使用,是不可忽視的語法細節。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • API
    API
    +關注

    關注

    2

    文章

    1505

    瀏覽量

    62168
  • python
    +關注

    關注

    56

    文章

    4799

    瀏覽量

    84815

原文標題:快學學Python異步IO輕松管理10k+并發連接

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux驅動學習筆記:異步IO

    前幾篇介紹了幾種IO模型,今天介紹另一種IO模型——異步IO
    發表于 06-12 16:24 ?715次閱讀

    python有哪些方向?

    。3. 爬蟲開發在爬蟲領域,Python幾乎是霸主地位,將網絡一切數據作為資源,通過自動化程序進行有針對性的數據采集以及處理。從事該領域應學習爬蟲策略、高性能異步IO、分布式爬蟲等,并針對Scrapy
    發表于 03-09 15:47

    Python就業狀況分析

    ,數據庫,數據分析,云基礎設施,設計,站點可靠性/測試,網絡抓取,安全性,移動開發,API等等。根據列出的職位,機會傾向于國際化需求,尤其是在英國地區。在任何主要工作網站搜索“Python開發人員”,會返回
    發表于 05-23 15:20

    怎么有效學習Python數據分析

    Python在人工智能、機器學習領域受到火熱追捧,很大程度上在于它擁有非常龐大的第三方庫,以及強大的通用編程性能。因此,快速掌握Python進行數據分析,就是學習Python各種第三方
    發表于 06-28 15:18

    python 數據分析基礎 day12-python調用mysql

    python 數據分析基礎 day12-python調用mysql
    發表于 10-23 13:34

    Python中的并行性和并發性分析

    理,異步編程,并發和并行性。我們使用python的多處理模塊來實現并行性,而Python中的并發是通過線程和異步IO模塊來實現的。并行運行的
    發表于 08-21 17:45

    異步IO是什么

    python 異步ioAsync IO is a concurrent programming design that has received dedicated support
    發表于 09-06 07:26

    《Linux設備驅動開發詳解》第9章、Linux設備驅動中的異步通知與異步IO

    《Linux設備驅動開發詳解》第9章、Linux設備驅動中的異步通知與異步IO
    發表于 10-27 11:33 ?0次下載
    《Linux設備驅動開發詳解》第9章、Linux設備驅動中的<b class='flag-5'>異步</b>通知與<b class='flag-5'>異步</b><b class='flag-5'>IO</b>

    淺析同步與異步Python的區別與概述

    你是否聽到人們說過,異步Python代碼比普通(或同步)Python代碼更快?果真是那樣嗎?
    的頭像 發表于 04-25 13:53 ?2223次閱讀
    淺析同步與<b class='flag-5'>異步</b><b class='flag-5'>Python</b>的區別與概述

    基于Python的聚類分析及其應用簡介

    基于Python的聚類分析及其應用簡介。
    發表于 05-28 10:54 ?8次下載

    FPGA 結構分析 -IO 資源

    關于 FPGA 的 IO資源分析共分為三個系列進行具體闡述,分別為: IO資源:分析FPGA IO資源的電氣特性;
    的頭像 發表于 12-13 13:20 ?1860次閱讀

    用于將數據從Google表單自動發布到Adafruit IOPython腳本

    電子發燒友網站提供《用于將數據從Google表單自動發布到Adafruit IOPython腳本.zip》資料免費下載
    發表于 06-16 15:47 ?0次下載
    用于將數據從Google表單自動發布到Adafruit <b class='flag-5'>IO</b>的<b class='flag-5'>Python</b>腳本

    信號驅動IO異步IO的區別

    一. 談信號驅動IO (對比異步IO來看) 信號驅動IO 對比 異步 IO進行理解 信號驅動
    的頭像 發表于 11-08 15:32 ?1090次閱讀
    信號驅動<b class='flag-5'>IO</b>與<b class='flag-5'>異步</b><b class='flag-5'>IO</b>的區別

    linux異步io框架iouring應用

    Linux內核5.1支持了新的異步IO框架iouring,由Block IO大神也即Fio作者Jens Axboe開發,意在提供一套公用的網絡和磁盤異步
    的頭像 發表于 11-08 15:39 ?691次閱讀
    linux<b class='flag-5'>異步</b><b class='flag-5'>io</b>框架iouring應用

    異步IO框架iouring介紹

    前言 Linux內核5.1支持了新的異步IO框架iouring,由Block IO大神也即Fio作者Jens Axboe開發,意在提供一套公用的網絡和磁盤異步
    的頭像 發表于 11-09 09:30 ?2492次閱讀
    <b class='flag-5'>異步</b><b class='flag-5'>IO</b>框架iouring介紹
    主站蜘蛛池模板: 国产精品色吧国产精品| 91精品婷婷国产综合久久8| 24小时日本免费看| 久久女婷五月综合色啪| 一区二区三区无码高清视频| 久久成人国产精品一区二区| 中文无码字慕在线观看| 伦理片97影视网| 18禁裸乳无遮挡免费网站| 美女视频黄色的| 88福利视频| 琪琪的色原网站| 国产黄A片在线观看永久免费麻豆| 双性人皇上被c到哭| 国产亚洲精品香蕉视频播放| 亚洲伊人久久大香线蕉综合图片| 麻豆精品无码久久久久久久久 | 欧美z000z猪| 国产精品JK白丝AV网站| 中国农村妇女真实BBWBBWBBW| 日美一级毛片| 可以看的黄页的网站| 国产福利高清在线视频| 1000部做羞羞事禁片免费视频网站| 涩涩免费网站| 男人J桶进男人屁股过程| 国产福利视频一区二区| 99E久热只有精品8在线直播| 亚洲国产高清福利视频| 日本zljzljzlj精品| 久久合| 国产成人免费全部网站| 97人人碰免费视频公开| 亚洲AV蜜桃永久无码精品无码网| 欧美日韩午夜群交多人轮换| 精品国产九九| 国产精品成人A蜜柚在线观看| caoporen超碰在线视频| 在线观看日本免费| 亚洲第一色网| 体育生爆操|