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

python實(shí)習(xí)總結(jié)(yeild,async,azwait和協(xié)程)

 更新時(shí)間:2021年10月08日 10:40:55   作者:==今天寫代碼了嗎  
今天是Python實(shí)習(xí)的第一天,熟悉了環(huán)境,第一次使用macbook,氛圍還不錯(cuò),努力學(xué)習(xí)新知識(shí),希望本片文章能給你帶來(lái)幫助

一、yield使用簡(jiǎn)析

yield是一個(gè)生成器generator,返回一個(gè)interable對(duì)象。

該對(duì)象具有next()方法,可以通過next()查看接下來(lái)的元素是什么。

1.interable對(duì)象 ,可以遍歷的對(duì)象,如: list,str,tuple,dict,file,xrange等。

2.yield的作用是什么?只是循環(huán)里面的獲取中間變量的一個(gè)方法,把想要的變量每次使用yield保存起來(lái)直至循環(huán)結(jié)束,循環(huán)結(jié)束得到了一個(gè)generator對(duì)象

3.為什么使用yield?使用yield,一個(gè)函數(shù)改寫成generator,便具有了迭代的能力,比起用類的實(shí)例保存狀態(tài)計(jì)算下一個(gè)需要迭代的值,代碼更加簡(jiǎn)潔,執(zhí)行流程十分簡(jiǎn)單。

4.如何判斷yield的類型?

def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b      # 使用 yield
        # print b 
        a, b = b, a + b 
        n = n + 1
for n in fab(5): 
    print n

fab不是generator,fab(5)是generator。

好比類的定義和類的實(shí)例的區(qū)別。

>>>import types 
>>> isinstance(fab, types.GeneratorType) 
False 
>>> isinstance(fab(5), types.GeneratorType) 
True

fab 是無(wú)法迭代的,而 fab(5) 是可迭代的。

>>>from collections import Iterable 
>>> isinstance(fab, Iterable) 
False 
>>> isinstance(fab(5), Iterable) 
True

5.yield在文件讀取的應(yīng)用?

如果字節(jié)使用read()讀取一個(gè)文件,會(huì)導(dǎo)致不可預(yù)測(cè)的內(nèi)存占用。好的方法是使用yield,固定長(zhǎng)度的緩沖區(qū)來(lái)不斷讀取文件,生成讀文件的迭代的generator。

def read_file(fpath): 
    BLOCK_SIZE = 1024 
    with open(fpath, 'rb') as f: 
        while True: 
            block = f.read(BLOCK_SIZE) 
            if block: 
                yield block 
            else: 
                return

二、async和await的使用

1.什么是進(jìn)程、協(xié)程、異步?

  • 協(xié)程是什么?

一種用戶級(jí)輕量級(jí)的線程,擁有自己的寄存器上下文和棧。

協(xié)程切換時(shí)候,將寄存器和棧保存在其他地方,當(dāng)返回的時(shí)候,恢復(fù)原先保存的寄存器上下文和棧。

  • 為什么使用協(xié)程?

主流語(yǔ)言采用多線程并發(fā),線程相關(guān)的概念是搶占式多任務(wù),協(xié)程相關(guān)的協(xié)作式多任務(wù)。

不管是多進(jìn)程還是多線程,每次阻塞、切換陷入系統(tǒng)調(diào)用。

CPU跑操作系統(tǒng)的調(diào)度程序,調(diào)度程序決定運(yùn)行哪一個(gè)進(jìn)程(線程)。

線程非常小心的處理同步問題,而協(xié)程完全不存在這個(gè)問題。

對(duì)于CPU而言,多協(xié)程是單線程,CPU不會(huì)考慮調(diào)度、切換上下文,省去CPU的切換開銷。協(xié)程好于多線程的原因。

  • 如何使用協(xié)程?

多進(jìn)程+協(xié)程下,避開了CPU切換的開銷,又能把多個(gè)CPU充分利用起來(lái),這種方式對(duì)于數(shù)據(jù)量較大的爬蟲還有文件讀寫之類的效率提升是巨大的。

2.如何處理200W數(shù)量的url,把所有的url保存下來(lái)?

  • 單進(jìn)程+單線程
  • 單進(jìn)程+多線程:開十個(gè)線程,速度不能提高十倍。線程的切換是有開銷的,無(wú)能無(wú)限的創(chuàng)建線程。
  • 多進(jìn)程+多線程:多進(jìn)程的每個(gè)進(jìn)程占用一個(gè)CPU,多線程一定程度上繞過了阻塞時(shí)間,所以相比單進(jìn)程的多線程效率更高。
  • 協(xié)程

3.使用async的await和gather

  • await接受一個(gè)協(xié)程列表,返回done、pending兩個(gè)列表。done是已經(jīng)完成的協(xié)程,pending是仍在跑的協(xié)程。通過.result()獲取完成的結(jié)果
  • gather以gather(cro1, cro2, cro3, cro4…)的方式接受協(xié)程,返回的是一個(gè)結(jié)合了這么多個(gè)任務(wù)的協(xié)程。

async的使用:https://blog.csdn.net/qq_29785317/article/details/103294235

async def func1(num):
    print('--func1 start--')
    await asyncio.sleep(num)
    print('--func1 done--')
    return 'func1 ok'
async def func2(num):
    print('--func2 start--')
    await asyncio.sleep(num)
    print('--func2 done--')
    return 'func2 ok'
async def main():
    task1 = asyncio.ensure_future(func1(3))
    task2 = asyncio.ensure_future(func2(5))
    tasks = [task1, task2]
    res = await asyncio.gather(*tasks)
    return res
    # done, pending = await asyncio.wait(tasks)
    # for t in done:
    #     print(t.result())
    # print(done)
    # print(pending)
if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    result = loop.run_until_complete(main())
    print(result)
```python
--func1 start--
--func2 start--
--func1 done--
--func2 done--
['func1 ok', 'func2 ok']

三、協(xié)程的理解

1.協(xié)程的過程

協(xié)程中yield是控制流程的方式。

yield同接收器一樣,是一個(gè)生成器,需要先激活才能使用。

>>> def simple_corotine():
...     print('---->coroutine started')
...     x = yield  #有接收值,所以同生成器一樣,需要先激活,使用next
...     print('---->coroutine recvied:',x)
...
>>> my_coro = simple_corotine()
>>> my_coro
<generator object simple_corotine at 0x0000000000A8A518>
>>> next(my_coro)  #先激活生成器,執(zhí)行到y(tǒng)ield val語(yǔ)句  #或者使用send(None)也可以激活生成器
---->coroutine started
>>> my_coro.send(24)  #向其中傳入值,x = yield
---->coroutine recvied: 24
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration  #當(dāng)生成器執(zhí)行完畢時(shí)會(huì)報(bào)錯(cuò)

協(xié)程在運(yùn)行中的四種狀態(tài)

GEN_CREATE:等待開始執(zhí)行

GEN_RUNNING:解釋器正在執(zhí)行,這個(gè)狀態(tài)一般看不到

GEN_SUSPENDED:在yield表達(dá)式處暫停

GEN_CLOSED:執(zhí)行結(jié)束

>>> def averager():
...     total = 0.0
...     count = 0
...     aver = None
...     while True:
...             term = yield aver
...             total += term
...             count += 1
...             aver = total/count
...
>>> coro_avg = averager()
>>> coro_avg.send(None)
>>> coro_avg.send(10)
10.0
>>> coro_avg.send(20)
15.0
>>> coro_avg.send(30)
20.0
>>> coro_avg.send(40)
25.0

每次循環(huán)結(jié)束在yield出暫停,直至下一個(gè)參數(shù)傳進(jìn)來(lái)。

3.預(yù)激活協(xié)程的裝飾器(自定義激活的方式)

@裝飾器的作用是什么?裝飾原有的函數(shù),給原油函數(shù)增加一個(gè)新的功能和方式。

為什么@可以實(shí)現(xiàn)裝飾器的功能?函數(shù)也是對(duì)象,函數(shù)可以作為實(shí)參傳給掐函數(shù)。

>>> def coro_active(func):
...     def inner(*args,**kwargs):
...         gen = func(*args,**kwargs)
...         next(gen)   #gen.send(None)
...         return gen
...     return inner
...
>>> @coro_active
... def averager():
...     total = 0.0
...     count = 0
...     aver = None
...     while True:
...             term = yield aver
...             total += term
...             count += 1
...             aver = total/count
...
>>> coro_avg = averager()
>>> coro_avg.send(10) 10.0 >>> coro_avg.send(20) 15.0 >>> coro_avg.send(30) 20.0

4.終止協(xié)程和異常處理

當(dāng)協(xié)程的next函數(shù)或者send函數(shù)發(fā)生錯(cuò)誤的時(shí)候,協(xié)程就會(huì)終止掉。

需要?jiǎng)?chuàng)建異常捕捉對(duì)協(xié)程的異常情況進(jìn)行處理,關(guān)閉當(dāng)前協(xié)程。

5.讓協(xié)程返回值

yield使用方法 ↩︎

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • pandas改變df列的順序的方法實(shí)現(xiàn)

    pandas改變df列的順序的方法實(shí)現(xiàn)

    本文主要介紹了pandas改變df列的順序的方法實(shí)現(xiàn),主要使用 Pandas 中的 reindex() 方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Python單例模式的兩種實(shí)現(xiàn)方法

    Python單例模式的兩種實(shí)現(xiàn)方法

    這篇文章主要介紹了Python單例模式的相關(guān)資料,這里提供了兩種實(shí)現(xiàn)方法,及注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • Python+Sympy實(shí)現(xiàn)計(jì)算微積分

    Python+Sympy實(shí)現(xiàn)計(jì)算微積分

    微積分的計(jì)算也許平時(shí)用不到,會(huì)讓人覺得有點(diǎn)高深,它們的計(jì)算過程中需要使用很多計(jì)算規(guī)則,但是使用?Sympy?可以有效減輕這方面的負(fù)擔(dān),本文就來(lái)和大家簡(jiǎn)單講講吧
    2023-07-07
  • python實(shí)現(xiàn)批量移動(dòng)文件

    python實(shí)現(xiàn)批量移動(dòng)文件

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)批量移動(dòng)文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Python實(shí)現(xiàn)用戶名和密碼登錄

    Python實(shí)現(xiàn)用戶名和密碼登錄

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)用戶名和密碼登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • python3實(shí)現(xiàn)短網(wǎng)址和數(shù)字相互轉(zhuǎn)換的方法

    python3實(shí)現(xiàn)短網(wǎng)址和數(shù)字相互轉(zhuǎn)換的方法

    這篇文章主要介紹了python3實(shí)現(xiàn)短網(wǎng)址和數(shù)字相互轉(zhuǎn)換的方法,涉及Python操作字符串的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • python3+django2開發(fā)一個(gè)簡(jiǎn)單的人員管理系統(tǒng)過程詳解

    python3+django2開發(fā)一個(gè)簡(jiǎn)單的人員管理系統(tǒng)過程詳解

    這篇文章主要介紹了python3+django2開發(fā)一個(gè)簡(jiǎn)單的人員管理系統(tǒng)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 已解決卸載pip重新安裝的方法

    已解決卸載pip重新安裝的方法

    粉絲群里面的一個(gè)小伙伴遇到問題跑來(lái)私信我,想用卸載pip重新安裝pip,但是發(fā)生了報(bào)錯(cuò)(當(dāng)時(shí)他心里瞬間涼了一大截,跑來(lái)找我求助,然后順利幫助他解決了,順便記錄一下希望可以幫助到更多遇到這個(gè)問題的小伙伴
    2023-04-04
  • Python上下文管理器實(shí)現(xiàn)方法總結(jié)

    Python上下文管理器實(shí)現(xiàn)方法總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于Python上下文管理器實(shí)現(xiàn)方法總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-07-07
  • python?sys模塊使用方法介紹

    python?sys模塊使用方法介紹

    sys模塊功能多,我們這里介紹一些比較實(shí)用的功能,相信你會(huì)喜歡的,和我一起走進(jìn)python的模塊吧
    2023-01-01

最新評(píng)論