python 知識小結 3

2021-08-09 10:19:04 字數 2086 閱讀 4860

非同步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違約造成的,當觸發器進入亞穩態,會導致不能 它的輸出,並且這種不確定性會沿著電路傳遞下去。理論上亞穩態不能消除,只能降低,亞穩態可以通過兩級或多級暫存器同步來處理。降低時鐘頻率 提高時鐘質量 指提高時鐘的上...