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語句會立即跳到...