python進階之異步任務


0.導語1.yield關鍵字2.異步加載asyncio第一種方式第二種方式

python進階之異步任務

0.導語

本文學習視頻來自莫凡python,下面是總結的學習內容。
關於星球,我在稍微闡述一點,我用自己的精力在星球中發佈小項目,發佈日打卡,共同來學習某一塊知識,所以改爲收費模式,希望通過收費可以篩選出一波真正想學習的人,共同堅持,就像公衆號一樣,屹立不倒,昨天立了個flag,每日分享一條消息或文字或技術,共同堅持學習!

更多幹貨分享加python編程語言學習QQ羣 515267276

1.yield關鍵字yield類似於return,
但不同之處在於它返回的是生成器!

生成器

  • 生成器是通過一個或多個yield表達式構成的函數。每一個生成器都是一個迭代器(但迭代器不一定是生成器)。

  • 生成器並不會一次返回所有結果,而是每次遇到yield關鍵字後返回相應結果,並保留函數當前的運行狀態。等待下一次的調用。

  • 由於生成器也是一個迭代器,那麼它就應該支持next方法來獲取下一個值。
    除此之外,生成器還支持send函數,該函數可以向生成器傳遞參數。

# 基本操作
def fun():
    for i in range(10):
        yield i
f = fun()
# 通過for循環+next進行調用
for i in range(10):
    print(next(f))

print('-----------------------------')
def func():
    n = 0
    while 1:
        n = yield n

f = func()
print(next(f))
print('------------------------------')
print(f.send(5)) # n賦值爲5

def func(number):
    while True:
        yield number
        number += 1

f = func(1)
print('------------------------------')

# 取出10個數
for i in range(10):
    print(next(f))


# 生產消費模式
print('------------------------------')
def consumer():
    r = ''
    while True:
        n = yield r
        if not n:
            return
        print('[CONSUMER] Consuming %s...' % n)
        r = '200 OK'

def produce(c):
    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()

c = consumer()
produce(c)

2.異步加載asyncio

asyncioasyncio可以實現單線程併發IO操作
async和await是針對coroutine的新語法,要使用新的語法,只需要做兩步簡單的替換:
把@asyncio.coroutine替換爲async;
把yield from替換爲await。

第一種方式

import asyncio

@asyncio.coroutine
def hello():
    print("Hello world!")
    r = yield from asyncio.sleep(1)
    print("Hello again!")

loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
loop.close()

第二種方式

更多幹貨分享加python編程語言學習QQ羣 515267276

async def hello2():
    print('Hello world2!')
    r = await asyncio.sleep(1)
    print('Hello again2!')

loop = asyncio.get_event_loop()
loop.run_until_complete(hello2())
loop.close()



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章