Python標準庫之asyncio

2021-08-23 12:43:53 字數 4518 閱讀 2636

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...