非同步io模型需要乙個訊息迴圈,在訊息迴圈中,主線程不斷地重複「讀取訊息-處理訊息」這一過程:
loop = get_event_loop()
while
true:
event = loop.get_event()
process_event(event)
asyncio是python 3.4版本引入的標準庫,直接內建了對非同步io的支援。
asyncio的程式設計模型就是乙個訊息迴圈。我們從asyncio模組中直接獲取乙個eventloop的引用,然後把需要執行的協程扔到eventloop中執行,就實現了非同步io。
用asyncio實現hello world**如下:
import asyncio
@asyncio.coroutine
defhello
(): 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試試:
# encoding=utf-8
import asyncio
import threading
@asyncio.coroutine
defhello
(): print("helloworld...{}".format(threading.current_thread()))
# 開始非同步呼叫asyncio.sleep(1)
r = yield
from asyncio.sleep(1)
print("hello again!..{}".format(threading.current_thread()))
# 獲取eventloop
loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
# 執行coroutine
loop.run_until_complete(asyncio.wait(tasks))
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)>)
python知識小結
1.當axis 0時,是把函式作用到每一列上,實質是列 當axis 1時,是把函式作用到每一行上,實質是行 2.以u或u開頭的字串表示unicode字串 unicode是書寫國際文字的標準方法。如果你想要用非英語寫文字,那麼你需要有乙個支援unicode的編輯器。類似地,python允許你處理uni...
python知識小結1
1.python類中方法引數cls self區別 類方法引數為cls,指呼叫該方法的類物件本身 類方法引數為self,指呼叫該方法的類例項物件 2.類屬性和例項屬性 類有類屬性,但沒有例項屬性,例項有例項屬性,但沒有類屬性。在類例項中查詢屬性的時候,首先在例項自己的作用域中查詢,如果沒有找到,則再在...
IC常用知識3 亞穩態小結
答 亞穩態是指觸發器無法在規定的時間到達乙個確定的狀態。是由於觸發器的tsetup thold違約造成的,當觸發器進入亞穩態,會導致不能 它的輸出,並且這種不確定性會沿著電路傳遞下去。理論上亞穩態不能消除,只能降低,亞穩態可以通過兩級或多級暫存器同步來處理。降低時鐘頻率 提高時鐘質量 指提高時鐘的上...