1. 程式人生 > >python進階之非同步任務

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()