asyncio
是python 3.4版本引入的標準庫,直接內建了對非同步io的支援。
asyncio
的程式設計模型就是乙個訊息迴圈。我們從asyncio
模組中直接獲取乙個eventloop
的引用,然後把需要執行的協程扔到eventloop
中執行,就實現了非同步io。
用asyncio
實現hello world
**如下:
importasyncio
@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試試
importthreading
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秒時間,然後另乙個操作好過去前乙個操作的結果並顯示。...