asyncio是python 3.4版本引入的標準庫,直接內建了對非同步io的支援。
asyncio的程式設計模型就是乙個訊息迴圈。我們從asyncio模組中直接獲取乙個eventloop的引用,然後把需要執行的協程扔到eventloop中執行,就實現了非同步io。
用asyncio實現hello world**如下:
import asyncio
@asyncio.coroutine
def hello():
print('hello world!')
# 非同步呼叫asyncio.sleep(1)
r = yield from asyncio.sleep(1)
print('hello again!!!')
# 獲取eventloop
loop = asyncio.get_event_loop()
# 執行coroutine
loop.run_until_complete(hello())
loop.close()
@asyncio.coroutine把乙個generator標記為coroutine型別,然後,我們就把這個coroutine扔到eventloop中執行。
hello()會首先列印出hello world!,然後,yield from語法可以讓我們方便地呼叫另乙個generator。由於asyncio.sleep()也是乙個coroutine,所以執行緒不會等待asyncio.sleep(),而是直接中斷並執行下乙個訊息迴圈。當asyncio.sleep()返回時,執行緒就可以從yield from拿到返回值(此處是none),然後接著執行下一行語句。
把asyncio.sleep(1)看成是乙個耗時1秒的io操作,在此期間,主線程並未等待,而是去執行eventloop中其他可以執行的coroutine了,因此可以實現併發執行。
我們用task封裝兩個coroutine試試:
import threading
import asyncio
@asyncio.coroutine
def hello():
print('hello world! (%s)' % threading.currentthread())
yield from asyncio.sleep(2)
print('hello again!!! (%s)' % threading.currentthread())
loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
觀察執行過程:
hello world! (<_mainthread(mainthread, started 3232)>)
hello world! (<_mainthread(mainthread, started 3232)>)
(暫停約2秒)
hello again!!! (<_mainthread(mainthread, started 3232)>)
hello again!!! (<_mainthread(mainthread, started 3232)>)
由列印的當前執行緒名稱可以看出,兩個coroutine是由同乙個執行緒併發執行的。
如果把asyncio.sleep()換成真正的io操作,則多個coroutine就可以由乙個執行緒併發執行。
loop.close()執行結果如下:
www.sohu.com header > fss-proxy: powered by 2669764.3587278.3762386可見3個鏈結由乙個執行緒通過coroutine併發完成。
asyncio提供了完善的非同步io支援;
非同步操作需要在coroutine中通過yield from來完成,它能讓你在乙個生成器函式中呼叫另乙個生成器函式,完成非同步io的操作;
多個coroutine可以封裝成一組task後,再使用asyncio.wait()等待所有任務列表裡的futures任務完成。
Python標準庫之time, datetime包
python具有良好的時間和日期管理功能。實際上,計算機只會維護乙個掛鐘時間 wall clock time 這個時間是從某個固定時間起點到現在的時間間隔。時間起點的選擇與計算機相關,但一台計算機的話,這一時間起點是固定的。其它的日期資訊都是從這一時間計算得到的。此外,計算機還可以測量cpu實際上執...
Python 標準庫之 shutil
shutil是shell utilities的簡寫,它提供了大量的檔案和目錄的高階操作。特別針對檔案 目錄的拷貝和刪除,主要功能為目錄和檔案操作以及壓縮操作。函式說明 shutil.copyfile src,dst 從源src複製到dst中去。如果當前的dst已存在的話就會被覆蓋掉,src 和 ds...
python標準庫之glob
python標準庫之glob介紹 glob 檔名模式匹配,不用遍歷整個目錄判斷每個檔案是不是符合。1 萬用字元 星號 匹配零個或多個字元 import glob for name in glob.glob dir print name 複製 dir file.txt dir file1.txt di...