事件驅動的編程側重于事件。最終,程序的流程取決于事件。到目前為止,我們處理順序或并行執行模型,但具有事件驅動編程概念的模型稱為異步模型。事件驅動的編程取決于始終偵聽新傳入事件的事件循環。事件驅動編程的工作取決于事件。一旦事件循環,然后事件決定執行什么以及以什么順序執行。以下流程圖將幫助您了解其工作原理
python模塊 - asyncio
asyncio模塊是在python 3.4中添加的,它提供了使用協同例程編寫單線程并發代碼的基礎結構。以下是asyncio模塊使用的不同概念
事件循環
事件循環是處理計算代碼中的所有事件的功能。它在整個程序的執行過程中發揮作用,并跟蹤事件的傳入和執行。asyncio模塊允許每個進程使用一個事件循環。以下是asyncio模塊提供的一些管理事件循環的方法
- loop = get_event_loop() - 此方法將為當前上下文提供事件循環。
- loop.call_later(time_delay,callback,argument) - 此方法安排在給定的time_delay秒之后調用的回調。
- loop.call_soon(callback,argument) - 此方法安排盡快調用的回調。 在call_soon()返回并且控件返回到事件循環時調用回調。
- loop.time() - 此方法用于根據事件循環的內部時鐘返回當前時間。
- asyncio.set_event_loop() - 此方法將當前上下文的事件循環設置為循環。
- asyncio.new_event_loop() - 此方法將創建并返回一個新的事件循環對象。
- loop.run_forever() - 此方法將一直運行,直到調用stop()方法。
例
以下事件循環示例通過使用get_event_loop()方法幫助打印 hello world 。此示例取自python官方文檔。
import asyncio def hello_world(loop): print('hello world') loop.stop() loop = asyncio.get_event_loop() loop.call_soon(hello_world, loop) loop.run_forever() loop.close()
輸出
hello world
期貨
這與concurrent.futures.future類兼容,該類表示尚未完成的計算。asyncio.futures.future和concurrent.futures.future之間存在以下差異
- result()和exception()方法不會使用超時參數,并在未來尚未完成時引發異常。
- 用add_done_callback()注冊的回調總是通過事件循環的call_soon()調用。
- asyncio.futures.future類與concurrent.futures包中的wait()和as_completed()函數不兼容。
例
以下是一個示例,可幫助您了解如何使用asyncio.futures.future類。
import asyncio async def myoperation(future): await asyncio.sleep(2) future.set_result('future completed') loop = asyncio.get_event_loop() future = asyncio.future() asyncio.ensure_future(myoperation(future)) try: loop.run_until_complete(future) print(future.result()) finally: loop.close()
輸出
future completed
協同程序
asyncio中的協同程序的概念類似于線程模塊下的標準thread對象的概念。這是子程序概念的概括。協程可以在執行期間暫停,以便等待外部處理并從外部處理完成時停止的點返回。以下兩種方式幫助我們實現協同程序
異步def函數()
這是在asyncio模塊下實現協同程序的方法。以下是相同的python腳本
import asyncio async def myoperation(): print("first coroutine") loop = asyncio.get_event_loop() try: loop.run_until_complete(myoperation()) finally: loop.close()
輸出
first coroutine
@ asyncio.coroutine裝飾
實現協同程序的另一種方法是利用@ asyncio.coroutine裝飾器來生成生成器。以下是相同的python腳本
import asyncio @asyncio.coroutine def myoperation(): print("first coroutine") loop = asyncio.get_event_loop() try: loop.run_until_complete(myoperation()) finally: loop.close()
輸出
first coroutine
任務
asyncio模塊的這個子類負責以并行方式在事件循環中執行協同程序。以下python腳本是并行處理某些任務的示例。
import asyncio import time async def task_ex(n): time.sleep(1) print("processing {}".format(n)) async def generator_task(): for i in range(10): asyncio.ensure_future(task_ex(i)) int("tasks completed") asyncio.sleep(2) loop = asyncio.get_event_loop() loop.run_until_complete(generator_task()) loop.close()
輸出
tasks completed processing 0 processing 1 processing 2 processing 3 processing 4 processing 5 processing 6 processing 7 processing 8 processing 9
asyncio
asyncio模塊提供用于實現各種類型通信的傳輸類。這些類不是線程安全的,并且在建立通信信道之后總是與協議實例配對。
以下是從basetransport繼承的不同類型的傳輸 -
- readtransport - 這是只讀傳輸的接口。
- writetransport - 這是只寫傳輸的接口。
- datagramtransport - 這是用于發送數據的接口。
- basesubprocesstransport - 類似于 basetransport 類。
以下是basetransport類的五種不同方法,這些方法隨后在四種傳輸類型中是瞬態的
- close() - 關閉運輸。
- is_closing() - 如果傳輸正在關閉或已經關閉,則此方法將返回true。傳輸。
- get_extra_info(name,default = none) - 這將為我們提供有關傳輸的一些額外信息。
- get_protocol() - 此方法將返回當前協議。
協議
asyncio模塊提供了可以子類化以實現網絡協議的基類。這些課程與運輸一起使用; 協議解析傳入的數據并請求傳出數據的寫入,而傳輸負責實際的i / o和緩沖。以下是三類議定書
- 協議 - 這是實現用于tcp和ssl傳輸的流協議的基類。
- datagramprotocol - 這是用于實現與udp傳輸一起使用的數據報協議的基類。
- subprocessprotocol - 這是用于實現通過一組單向管道與子進程通信的協議的基類。