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

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

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

一、yield使用簡析

yield是一個生成器generator,返回一個interable對象。

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

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

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

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

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。

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

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

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

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

5.yield在文件讀取的應用?

如果字節(jié)使用read()讀取一個文件,會導致不可預測的內(nèi)存占用。好的方法是使用yield,固定長度的緩沖區(qū)來不斷讀取文件,生成讀文件的迭代的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.什么是進程、協(xié)程、異步?

  • 協(xié)程是什么?

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

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

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

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

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

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

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

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

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

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

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

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

3.使用async的await和gather

  • await接受一個協(xié)程列表,返回done、pending兩個列表。done是已經(jīng)完成的協(xié)程,pending是仍在跑的協(xié)程。通過.result()獲取完成的結果
  • gather以gather(cro1, cro2, cro3, cro4…)的方式接受協(xié)程,返回的是一個結合了這么多個任務的協(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同接收器一樣,是一個生成器,需要先激活才能使用。

>>> 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語句  #或者使用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  #當生成器執(zhí)行完畢時會報錯

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

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

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

GEN_SUSPENDED:在yield表達式處暫停

GEN_CLOSED:執(zhí)行結束

>>> 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)結束在yield出暫停,直至下一個參數(shù)傳進來。

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

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

為什么@可以實現(xiàn)裝飾器的功能?函數(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é)程和異常處理

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

需要創(chuàng)建異常捕捉對協(xié)程的異常情況進行處理,關閉當前協(xié)程。

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

yield使用方法 ↩︎

總結

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

相關文章

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

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

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

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

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

    Python+Sympy實現(xiàn)計算微積分

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

    python實現(xiàn)批量移動文件

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

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

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

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

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

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

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

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

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

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

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

    python?sys模塊使用方法介紹

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

最新評論