欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?async模塊使用方法雜談

 更新時(shí)間:2023年04月06日 09:03:52   作者:右眸Remnant  
協(xié)程(Coroutine),也可以被稱為微線程,是一種用戶態(tài)內(nèi)的上下文切換技術(shù)。簡而言之,其實(shí)就是通過一個(gè)線程實(shí)現(xiàn)代碼塊相互切換執(zhí)行

提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔

協(xié)程:協(xié)程(Coroutine),也可以被稱為微線程,是一種用戶態(tài)內(nèi)的上下文切換技術(shù)。簡而言之,其實(shí)就是通過一個(gè)線程實(shí)現(xiàn)代碼塊相互切換執(zhí)行

Python對(duì)協(xié)程的支持是通過generator實(shí)現(xiàn)的。

在generator中,我們不但可以通過for循環(huán)來迭代,還可以不斷調(diào)用next()函數(shù)獲取由yield語句返回的下一個(gè)值。 但是Python的yield不但可以返回一個(gè)值,它還可以接收調(diào)用者發(fā)出的參數(shù)。

一、什么是 generator(生成器)

在Python中,這種一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器:generator。通過給定一個(gè)算法然后在調(diào)用的過程中計(jì)算真實(shí)值。

當(dāng)需要從generator中獲取值的時(shí)候可以使用next(),但是一般使用for循環(huán)進(jìn)行獲取。

generator的實(shí)現(xiàn)方式

生成器,使用()表示

如:[1, 2, 3, 4, 5],生成器方法:

data = [1, 2, 3, 4, 5]
(x * x for x in len(data))

函數(shù)定義在一些邏輯復(fù)雜的場(chǎng)景下,使用第一種方法不太合適,因此存在類型函數(shù)定義的方式,如:

def num(x):
    while (x < 10):
        print(x * x)
        x += 1
g = num(1)
for item in g:
    print(item)

當(dāng)函數(shù)中出現(xiàn)yield的時(shí)候,此時(shí)就成為generator

def num(x):
    while (x < 10):
        yield x * x  # 返回結(jié)果,下次從這個(gè)地方繼續(xù)?
        x += 1
g = num(1)  # 返回的是generator對(duì)象
for item in g:
    print(item)

變成generator的函數(shù),在每次調(diào)用next()的時(shí)候執(zhí)行,遇到y(tǒng)ield語句返回,再次執(zhí)行時(shí)從上次返回的yield語句處繼續(xù)執(zhí)行。

二、使用asyncio 實(shí)現(xiàn)異步io

異步io通過事件循環(huán)和協(xié)程函數(shù)實(shí)現(xiàn)

事件循環(huán)即不斷監(jiān)察內(nèi)部的任務(wù),如果存在則執(zhí)行;任務(wù)分為可執(zhí)行和正在執(zhí)行;由事件循環(huán)決定處理任務(wù),如果任務(wù)列表為空,事件終止。

import asyncio
# 生成或獲取事件循環(huán)對(duì)象loop;類比Java的Netty,我理解為開啟一個(gè)selector
loop = asyncio.get_event_loop()  
# 將協(xié)程函數(shù)(任務(wù))提交到事件循環(huán)的任務(wù)列表中,協(xié)程函數(shù)執(zhí)行完成之后終止。
# run_until_complete 會(huì)檢查協(xié)程函數(shù)的運(yùn)行狀態(tài),并執(zhí)行協(xié)程函數(shù)
loop.run_until_complete( func() ) 

test demo

import asyncio
import time
async def test():
    print("io等待")
    await asyncio.sleep(1)
    return 'hello'
async def hello():
    print("Hello world")
    r = await test()
    print("hello again")
loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

協(xié)程函數(shù):由 async def 修飾的函數(shù);相比于普通的def, 如 def func(),可以直接接收到函數(shù)返回的值;但是對(duì)于協(xié)程函數(shù)返回的是一個(gè)協(xié)程對(duì)象。

想要運(yùn)行協(xié)程函數(shù),需要將這個(gè)對(duì)象交給事件循環(huán)進(jìn)行處理。

# 測(cè)試協(xié)程
import asyncio
import time, datetime
# 異步函數(shù)不同于普通函數(shù),調(diào)用普通函數(shù)會(huì)得到返回值
# 而調(diào)用異步函數(shù)會(huì)得到一個(gè)協(xié)程對(duì)象。我們需要將協(xié)程對(duì)象放到一個(gè)事件循環(huán)中才能達(dá)到與其他協(xié)程對(duì)象協(xié)作的效果
# 因?yàn)槭录h(huán)會(huì)負(fù)責(zé)處理子程 序切換的操作。
async def Print():
    return "hello"
loop = asyncio.get_event_loop()
loop.run_until_complete(Print)

await:

用法:reponse = await + 可等待對(duì)象

可等待對(duì)象: 協(xié)程對(duì)象, Future, Task對(duì)象 可理解為IO等待

response : 等待的結(jié)果

await 遇到IO操作會(huì)掛起當(dāng)前協(xié)程(任務(wù)),當(dāng)前協(xié)程掛起時(shí),事件循環(huán)可以去執(zhí)行其他協(xié)程(任務(wù))

注意:可等待對(duì)象若是協(xié)程對(duì)象則變成串行,若是Task對(duì)象則并發(fā)運(yùn)行

Task對(duì)象,可以在事件循環(huán)列表中添加多個(gè)任務(wù)??梢酝ㄟ^**asyncio.create_task(協(xié)程對(duì)象)**的方式創(chuàng)建Task對(duì)象

import asyncio
import time, datetime
async def display(num):
    pass
tasks = []
for num in range(10):
    tasks.append(display(num))  # 生成任務(wù)列表
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

asnyc和await是新語法,舊版本為:@asyncio.coroutine 和 yield from

三、aiohttp

asyncio可以實(shí)現(xiàn)單線程并發(fā)IO操作。如果僅用在客戶端,發(fā)揮的威力不大。如果把a(bǔ)syncio用在服務(wù)器端,例如Web服務(wù)器,由于HTTP連接就是IO操作,因此可以用單線程+coroutine實(shí)現(xiàn)多用戶的高并發(fā)支持。

aiohttp則是基于asyncio實(shí)現(xiàn)的HTTP框架。

可以類似requests發(fā)送請(qǐng)求 get請(qǐng)求

可以通過params參數(shù)來指定要傳遞的參數(shù)

async def fetch(session):
    async with session.get("http://localhost:10056/test/") as response:
        data = json.loads(await response.text())
        print(data["data"])

post請(qǐng)求

  • 異步的執(zhí)行兩個(gè)任務(wù)
  • 在網(wǎng)絡(luò)請(qǐng)求中,一個(gè)請(qǐng)求就是一個(gè)會(huì)話,然后aiohttp使用的是ClientSession來管理會(huì)話
  • 使用session.method發(fā)送請(qǐng)求
  • 對(duì)于響應(yīng)信息response, 通過status來獲取響應(yīng)狀態(tài)碼,text()來獲取到響應(yīng)內(nèi)容;可以在text()指定編碼格式。 在response.text()前面添加await表示等待響應(yīng)結(jié)果
async def init(num):
    async with aiohttp.ClientSession() as session:
        if num == 1:
            time.sleep(5)
        print("session begin", num)
        async with session.post("http://localhost:10056/hello/", data=json.dumps({"data": "hello"})) as response:
            print("client begin", num)
            data = json.loads(await response.text())

            print(data["data"])
        print("session end", num)
    print("other")
if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    tasks = [init(1), init(2)]
    loop.run_until_complete(asyncio.wait(tasks))

到此這篇關(guān)于Python async模塊使用方法雜談的文章就介紹到這了,更多相關(guān)Python async模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pycharm安裝教程(下載安裝以及設(shè)置中文界面)

    pycharm安裝教程(下載安裝以及設(shè)置中文界面)

    這篇文章主要給大家介紹了關(guān)于pycharm安裝教程,文中包括下載安裝以及設(shè)置中文界面,PyCharm是一款Python IDE,其帶有一整套可以幫助用戶在使用Python語言開發(fā)時(shí)提高其效率的工具,需要的朋友可以參考下
    2023-10-10
  • Python基礎(chǔ)之賦值,淺拷貝,深拷貝的區(qū)別

    Python基礎(chǔ)之賦值,淺拷貝,深拷貝的區(qū)別

    這篇文章主要介紹了Python基礎(chǔ)之賦值,淺拷貝,深拷貝的區(qū)別,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python基礎(chǔ)的小伙伴們也有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 使用django自帶的user做外鍵的方法

    使用django自帶的user做外鍵的方法

    這篇文章主要介紹了使用django自帶的user做外鍵的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 用python寫一個(gè)定時(shí)提醒程序的實(shí)現(xiàn)代碼

    用python寫一個(gè)定時(shí)提醒程序的實(shí)現(xiàn)代碼

    今天小編就為大家分享一篇用python寫一個(gè)定時(shí)提醒程序的實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 一篇文章帶你了解python異?;A(chǔ)

    一篇文章帶你了解python異?;A(chǔ)

    今天小編就為大家分享一篇關(guān)于Python中的異常介紹,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-08-08
  • 使用python編寫監(jiān)聽端

    使用python編寫監(jiān)聽端

    這篇文章主要為大家詳細(xì)介紹了使用python編寫監(jiān)聽端,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python xml解析實(shí)例詳解

    python xml解析實(shí)例詳解

    這篇文章主要介紹了python xml解析實(shí)例詳解的相關(guān)資料,這里舉例說明如何實(shí)現(xiàn),需要的朋友可以參考下
    2016-11-11
  • Python中方法的缺省參數(shù)問題解讀

    Python中方法的缺省參數(shù)問題解讀

    這篇文章主要介紹了Python中方法的缺省參數(shù)問題解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Python中for循環(huán)可迭代對(duì)象迭代器及生成器源碼學(xué)習(xí)

    Python中for循環(huán)可迭代對(duì)象迭代器及生成器源碼學(xué)習(xí)

    這篇文章主要為大家介紹了Python中for循環(huán)可迭代對(duì)象迭代器及生成器的源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 詳解Python開啟線程和線程池的方法

    詳解Python開啟線程和線程池的方法

    這篇文章主要介紹了Python開啟線程和線程池的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-03-03

最新評(píng)論