python學習筆記 非同步asyncio

2022-07-25 06:21:08 字數 3599 閱讀 3872

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()會先列印出helloworld,然後yield from可以讓我們方便的呼叫另乙個generator,由於asyncio.sleep(1)也是乙個coroutine

所以執行緒不會等待asyncio.sleep而是直接中斷並執行下乙個訊息迴圈,當asyncio.sleep返回的時候,執行緒就在yield from拿到返回值,此處是none

然後執行下乙個語句

把asyncio.sleep(1)看成是乙個耗時1秒的io操作。在此期間主線程沒有等待,而是去執行eventloop其他可以執行的coroutine因此可以實現併發執行

接下來封裝2個coroutine試試

import

threading

import

asyncio

@asyncio.coroutine

defhello():

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

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

由列印的當前執行緒名稱可以看出,兩個coroutine是由同乙個執行緒併發執行的。

如果把asyncio.sleep()換成真正的io操作,則多個coroutine就可以由乙個執行緒併發執行。

(等待一段時間)

(列印出sohu的header)

...(列印出sina的header)

...(列印出163的header)

asyncio提供了完善的非同步io支援;

非同步操作需要在coroutine中通過yield from完成;

多個coroutine可以封裝成一組task然後併發執行。

python3非同步asyncio學習筆記

1 定義 微執行緒,人為創造協程,控制程式上下文切換執行流程,乙個執行緒中只能有乙個協程 2 python實現協程 1 yield yield from 2 asyncio模組 3 gevent模組 版本python3.5以上 1 事件迴圈 asyncio.get event loop 檢測並執行某...

Python學習 非同步IO

在io程式設計一節中,我們已經知道,cpu的速度遠遠快於磁碟 網路等io。在乙個執行緒中,cpu執行 的速度極快,然而,一旦遇到io操作,如讀寫檔案 傳送網路資料時 就需要等待io操作完成,才能繼續進行下一步操作。這種情況稱為同步io 在io操作的過程中,當前執行緒被掛起,而其他需要cpu執行的 就...

C 學習筆記 非同步操作

預設情況下我們的 都是同步操作。這種情況下,所有的操作都在同乙個執行緒中,如果遇到需要長時間執行的操作或者是乙個io操作,那麼 可能會阻塞比較長的時間。在阻塞的這段時間裡,無法進行其他工作,這是很不好的。這裡是乙個同步操作的例子。乙個操作需要大約5秒時間,然後另乙個操作好過去前乙個操作的結果並顯示。...