亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python異步IO的項(xiàng)目實(shí)踐

 更新時(shí)間:2023年06月07日 09:01:35   作者:快樂江小魚  
本文主要介紹了python異步IO的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

asyncio是python3.4引入的標(biāo)準(zhǔn)庫,內(nèi)置對(duì)異步IO的支持。asyncio的編程模型是一個(gè)消息循環(huán),從asyncio模塊中直接獲取一個(gè)EventLoop的引用,然后把需要執(zhí)行的協(xié)程放入EventLoop中執(zhí)行,就實(shí)現(xiàn)了異步IO。

協(xié)程又稱為微線程。子程序在所有語言中都是層級(jí)調(diào)用,子程序調(diào)用通過棧實(shí)現(xiàn)。一個(gè)線程就是執(zhí)行一個(gè)子程序。協(xié)程最大的優(yōu)勢(shì)是執(zhí)行效率高,子程序切換不是線程切換,而是由程序自身控制。第二個(gè)優(yōu)勢(shì)是不需要多線程的鎖機(jī)制。python對(duì)協(xié)程的支持通過generator實(shí)現(xiàn),generator中,可以通過for循環(huán)來迭代,也可以不斷調(diào)用next()函數(shù)獲取由yield語句返回的下一個(gè)值。

協(xié)程示例,@asyncio.coroutine把一個(gè)生成器標(biāo)記為coroutine類型,自python3.8棄用,使用async def替代。

import threading
import asyncio
@asyncio.coroutine
def hello():
? ? print('Hello World! (%s)' % threading.current_thread())
? ? # yield from調(diào)用另一個(gè)生成器
? ? r = yield from asyncio.sleep(1)
? ? print('Hello Again! (%s)' % threading.current_thread())
loop = asyncio.get_event_loop()
# 兩個(gè)協(xié)程是由同一個(gè)線程并發(fā)執(zhí)行的
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

結(jié)果:

Hello World! (<_MainThread(MainThread, started 49300)>)
Hello World! (<_MainThread(MainThread, started 49300)>)
Hello again! (<_MainThread(MainThread, started 49300)>)
Hello again! (<_MainThread(MainThread, started 49300)>)

推薦使用async/await語法編寫協(xié)程應(yīng)用。

# 直接調(diào)用main()并不會(huì)執(zhí)行協(xié)程應(yīng)用。
>>> import asyncio
>>> async def main():
...        print('hello')    
...        await asyncio.sleep(1)
...        print('world')
>>> asyncio.run(main())
hello
world

傳統(tǒng)生產(chǎn)消費(fèi)模型,一個(gè)線程寫消息,一個(gè)線程讀消息,通過鎖機(jī)制控制隊(duì)列和等待,但一不小心就可能死鎖。改用協(xié)程生產(chǎn)消息后直接通過yield跳轉(zhuǎn)到消費(fèi)者開始執(zhí)行,待消費(fèi)者執(zhí)行完畢后,切換回生產(chǎn)者,效率極高。

# consumer函數(shù)是一個(gè)生成器
def consumer():
? ? r = ''
? ? while True:
? ? ? ? n = yield r
? ? ? ? if not n:
? ? ? ? ? ? return?
? ? ? ? print('[COUSUMER] Consuming %s...' % n)
? ? ? ? r = '200 OK'
def produce(c):
? ? # 啟動(dòng)生成器
? ? c.send(None)
? ? n = 0
? ? while n < 5:
? ? ? ? n = n + 1
? ? ? ? print('[PRODUCER] Producing %s...' % n)
? ? ? ? r = c.send(n)
? ? ? ? print('[PRODUCER] Consumer return:%s' % r)
? ? c.close()
# 注意到consumer函數(shù)是一個(gè)generator,把一個(gè)consumer傳入produce后:
# 首先調(diào)用c.send(None)啟動(dòng)生成器;
# 然后,一旦生產(chǎn)了東西,通過c.send(n)切換到consumer執(zhí)行;
# consumer通過yield拿到消息處理,又通過yield把結(jié)果傳回;
# produce拿到consumer處理的結(jié)果,繼續(xù)生產(chǎn)下一條消息;
# produce決定不生產(chǎn)了,通過c.close()關(guān)閉consumer,整個(gè)過程結(jié)束。
# 整個(gè)流程無鎖,由一個(gè)線程執(zhí)行,produce和consumer協(xié)作完成任務(wù),所以稱為“協(xié)程”,而非線程的搶占式多任務(wù)。 ? ?
c = consumer()
produce(c)

asyncio可以實(shí)現(xiàn)單線程并發(fā)IO操作,用單線程+coroutine實(shí)現(xiàn)多用戶的高并發(fā)支持,asyncio實(shí)現(xiàn)了TCP、UDP、SSL等協(xié)議,aiohttp則是基于asyncio實(shí)現(xiàn)的HTTP框架。

import asyncio
from aiohttp import web
def index(request):
? ? return web.Response(body=b'<h1>Index</h1>')
def hello(request):
? ? yield from asyncio.sleep(0.5)
? ? text = '<h1>Hello, %s!</h1>' % request.match_info['name']
? ? return web.Response(body=text.encode('utf-8'))
@asyncio.coroutine
def init(loop):
? ? app = web.Application(loop=loop)
? ? app.router.add_route('GET', '/', index)
? ? app.router.add_router('GET', '/hello/{name}', hello)
? ? srv = yield from loop.create_server(app.make_handler(), '127.0.0.1', 8000)
? ? print('Server started at http://127.0.0.1:8000')
? ? return srv
loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()

到此這篇關(guān)于python異步IO的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)python異步IO內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python操作列表常用方法實(shí)例小結(jié)【創(chuàng)建、遍歷、統(tǒng)計(jì)、切片等】

    Python操作列表常用方法實(shí)例小結(jié)【創(chuàng)建、遍歷、統(tǒng)計(jì)、切片等】

    這篇文章主要介紹了Python操作列表常用方法,結(jié)合實(shí)例形式總結(jié)分析了Python列表常見的創(chuàng)建、遍歷、統(tǒng)計(jì)、切片等操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-10-10
  • flask設(shè)置cookie

    flask設(shè)置cookie

    這篇文章主要介紹了flask設(shè)置cookie,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • 使用Python快速搭建文件傳輸服務(wù)的方法

    使用Python快速搭建文件傳輸服務(wù)的方法

    這篇文章主要介紹了使用Python快速搭建一個(gè)文件傳輸服務(wù),這樣任何一個(gè)人都能打開瀏覽器把他電腦上的文件傳給我了,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 對(duì)numpy中shape的深入理解

    對(duì)numpy中shape的深入理解

    今天小編就為大家分享一篇對(duì)numpy中shape的深入理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Pytorch 多塊GPU的使用詳解

    Pytorch 多塊GPU的使用詳解

    今天小編就為大家分享一篇Pytorch 多塊GPU的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 使用numpy.ndarray添加元素

    使用numpy.ndarray添加元素

    這篇文章主要介紹了使用numpy.ndarray添加元素,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python實(shí)現(xiàn)的用戶登錄系統(tǒng)功能示例

    Python實(shí)現(xiàn)的用戶登錄系統(tǒng)功能示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的用戶登錄系統(tǒng)功能,涉及Python流程控制及字符串判斷等相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • python繪制雷達(dá)圖實(shí)例講解

    python繪制雷達(dá)圖實(shí)例講解

    在本篇文章里小編給大家整理了一篇關(guān)于python繪制雷達(dá)圖實(shí)例講解內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-01-01
  • 解決django中ModelForm多表單組合的問題

    解決django中ModelForm多表單組合的問題

    今天小編就為大家分享一篇解決django中ModelForm多表單組合的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python logging日志模塊的詳解

    python logging日志模塊的詳解

    這篇文章主要介紹了python logging日志模塊的詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10

最新評(píng)論