Python學習筆記 20 2章 asyncio

2021-08-28 08:17:57 字數 3912 閱讀 3300

1、概覽

asyncio

是python 3.4

版本引入的標準庫,直接內建了對非同步

io的支援

asyncio

的程式設計模型就是乙個訊息迴圈。我們從

asyncio

模組中直接獲取乙個

eventloop

的引用,然後把需要執行的協程扔到

eventloop

中執行,就實現了非同步io。

1.1、asyncioio的關鍵字

2、例項

2.1、用asyncio實現hello world

import asyncio

@asyncio.coroutine# 把

generator標記為coroutine型別

def hello():

print("hello world!")

r = yield from asyncio.sleep(1)

# 非同步呼叫asyncio.sleep(1)

print("hello again!")

loop = asyncio.get_event_loop()

# 建立訊息事件,開啟了事件迴圈

loop.run_until_complete(hello())

# 將協程物件註冊到事件迴圈,由事件迴圈呼叫

loop.close()

# 關閉事件

把asyncio.sleep(1)

看成是乙個耗時1秒的io操作,在此期間,主線程並未等待,而是去執行

eventloop

中其他可以執行的

coroutine

了,因此可以實現併發執行。

因為loop

裡只有乙個事件【

hello()

】,所以會暫停

1秒,列印「

hello again

」 2.2、用task封裝兩個coroutine

import threading

import asyncio

@asyncio.coroutine# 把

generator標記為coroutine型別

def hello():

print('hello world! (%s)' % threading.currentthread())

# 列印當前執行緒號

yield from asyncio.sleep(1)

print('hello again! (%s)' % threading.currentthread())

loop = asyncio.get_event_loop()

tasks = [hello(), hello()]

# 定義任務

loop.run_until_complete(asyncio.wait(tasks))

#asyncio.wait()

等待子程序終止

loop.close()

# 關閉訊息事件 #

執行過程

hello world! (<_mainthread(mainthread, started 140735195337472)>)

hello world! (<_mainthread(mainthread, started 140735195337472)>)

(暫停約1秒)

hello again! (<_mainthread(mainthread, started 140735195337472)>)

hello again! (<_mainthread(mainthread, started 140735195337472)>)

# 解析

這裡的loop裡有兩個hello事件,下面簡稱h1和h2。

首先h1

被執行,列印了

"hello      world"

,非同步執行了asyncio.sleep(1),需要暫停1秒

loop

不會等待,將

h1掛起,直接執行

h2,又列印了

"hello      world"

,然後又碰到asyncio.sleep(1),需要暫停1秒

1秒後,再次執行h1和

h2,因為

cpu處理速度很快,所以雖然h2比

h1晚暫停,但是幾乎感覺不到

2.3、用asyncio

的非同步網路連線來獲取

sina

、sohu

和163

的**首頁

import asyncio

@asyncio.coroutine# 把

generator標記為coroutine型別

def wget(host):

print('wget %s...' % host)

connect = asyncio.open_connection(host, 80)

#建立非同步連線

reader, writer = yield from connect

#非同步呼叫

connect

,返回reader

,writer

兩個例項,這是固定的兩個例項

# 設定

header

writer.write(header.encode('utf-8'))

yield from writer.drain()

# 將設定的

header

寫入connect

while true:

line = yield from reader.readline()

#讀取返回的

# 執行結果

wget www.sohu.com...

wget www.sina.com.cn...

wget www.163.com...

(等待一段時間)

(列印出sohu的header)

...(列印出sina的header)

...(列印出163的header)

3個連線由乙個執行緒通過

coroutine

併發完成

3、小結

4、擴充套件文件

python中重要的模組--asyncio

() python yield

與yield from

(

Leetcode周賽 202學習筆記

leetcode官方題解 1552 兩球之間的磁力 題意理解 給定position陣列,從中選取m個,使得這m個資料中,任意兩個數的差值的最小值最大。比如 position 1,2,3,6 m 3。那麼所有的選取情況為 1,2,3 1,2,6 2,3,6 1,3,6 每種情況下任意兩數差值的最小值為...

2 02 python基礎學習 0413

list列表 一種資料型別,有序集合,可以任意新增刪除元素。tuple 的缺陷 當你定義乙個tuple時,在定義的時候,tuple 的元素就必須被確定下來。eg t 1,2 t 1,2 定義乙個空tuple tuple 2.定義只有乙個元素的tuple tuple 1,2 請問以下變數哪些是tupl...

2 02 python基礎學習 0427

迴圈 python 的迴圈有兩種,一種是 for in 迴圈,依次把 list 或 tuple 中的每個元素迭代出來 for迴圈語法 for 迭代變數 in 物件 序列 迴圈體 練習 在迴圈內部變數 n 不斷自減,直到變為 1 時,不再滿足 while 條件,迴圈退出。continue語句會立即跳到...