鍍金池/ 教程/ Python/ 事件驅(qū)動(dòng)程序
事件驅(qū)動(dòng)程序
反應(yīng)式編程
進(jìn)程池
線程
線程池
Python并發(fā)簡介
并發(fā)vs并行
同步線程
調(diào)試線程應(yīng)用程序
進(jìn)程間通信
線程通信
Python并發(fā)編程教程
測(cè)試線程應(yīng)用程序
基準(zhǔn)和性能分析
系統(tǒng)和內(nèi)存架構(gòu)
線程的實(shí)現(xiàn)
多進(jìn)程

事件驅(qū)動(dòng)程序

事件驅(qū)動(dòng)程序側(cè)重于事件。 最終,程序的流程取決于事件。 到目前為止,我們正在處理順序或并行執(zhí)行模型,但具有事件驅(qū)動(dòng)編程概念的模型稱為異步模型。 事件驅(qū)動(dòng)的編程依賴于一直監(jiān)聽新來的事件的事件循環(huán)。 事件驅(qū)動(dòng)編程的工作取決于事件。 一旦事件循環(huán),事件就決定執(zhí)行什么以及按什么順序執(zhí)行。 以下流程圖將幫助您了解其工作原理 -

Python模塊 - Asyncio

Asyncio模塊是在Python 3.4中添加的,它提供了使用協(xié)同例程編寫單線程并發(fā)代碼的基礎(chǔ)結(jié)構(gòu)。 以下是Asyncio模塊使用的不同概念 -

事件循環(huán)
事件循環(huán)是處理計(jì)算代碼中所有事件的功能。 它在執(zhí)行整個(gè)程序的過程中一路行動(dòng),并跟蹤事件的傳入和執(zhí)行。 Asyncio模塊允許每個(gè)進(jìn)程使用一個(gè)事件循環(huán)。 以下是Asyncio模塊提供的用于管理事件循環(huán)的一些方法 -

  • loop = get_event_loop() - 此方法將為當(dāng)前上下文提供事件循環(huán)。
  • loop.call_later(time_delay,callback,argument) - 此方法安排在給定的time_delay秒后要調(diào)用的回調(diào)。
  • loop.call_soon(callback,argument) - 該方法安排一個(gè)盡可能快地被調(diào)用的回調(diào)函數(shù)。 回調(diào)在call_soon()返回并且控件返回到事件循環(huán)后調(diào)用。
  • loop.time() - 此方法用于根據(jù)事件循環(huán)的內(nèi)部時(shí)鐘返回當(dāng)前時(shí)間。
  • asyncio.set_event_loop() - 此方法將設(shè)置當(dāng)前上下文的事件循環(huán)為循環(huán)。
  • asyncio.new_event_loop() - 此方法將創(chuàng)建并返回一個(gè)新的事件循環(huán)對(duì)象。
  • loop.run_forever() - 此方法將運(yùn)行,直到調(diào)用stop()方法。

例子
下面的事件循環(huán)示例通過使用get_event_loop()方法幫助打印hello world。 這個(gè)例子取自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()

輸出結(jié)果如下 -

Hello World

特征 - Future
這與表示未完成的計(jì)算的concurrent.futures.Future類兼容。 asyncio.futures.Futureconcurrent.futures.Future之間存在以下差異 -

  • result()exception()方法不會(huì)接受超時(shí)參數(shù),并在未來尚未完成時(shí)引發(fā)異常。
  • 通過add_done_callback()注冊(cè)的回調(diào)函數(shù)總是通過事件循環(huán)的call_soon()來調(diào)用。
  • asyncio.futures.Future類與concurrent.futures包中的wait()as_completed()函數(shù)不兼容。

例子

以下演示如何使用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()

輸出結(jié)果如下 -

Future Completed

協(xié)同程序
Asyncio中的協(xié)程的概念與線程模塊下的標(biāo)準(zhǔn)線程對(duì)象的概念類似。 這是子程序概念的一般化。 協(xié)程在執(zhí)行過程中可以暫停,以等待外部處理,并在完成外部處理時(shí)從其停止點(diǎn)返回。 以下兩種方式可以幫助我們實(shí)施協(xié)同程序 -

async def function()
這是在Asyncio模塊下實(shí)現(xiàn)協(xié)程的一種方法。 以下是一個(gè)相同的Python腳本 -

import asyncio

async def Myoperation():
   print("First Coroutine")

loop = asyncio.get_event_loop()
try:
   loop.run_until_complete(Myoperation())

finally:
   loop.close()

執(zhí)行上面示例代碼,得到以下結(jié)果 -

First Coroutine

@asyncio.coroutine裝飾器

另一種實(shí)現(xiàn)協(xié)程的方法是使用帶有@asyncio.coroutine修飾器的生成器。 以下是一個(gè)相同的Python腳本 -

import asyncio

@asyncio.coroutine
def Myoperation():
   print("First Coroutine")

loop = asyncio.get_event_loop()
try:
   loop.run_until_complete(Myoperation())

finally:
   loop.close()

執(zhí)行上面示例代碼,得到以下結(jié)果 -

First Coroutine

任務(wù)
Asyncio模塊的這個(gè)子類負(fù)責(zé)以并行方式在事件循環(huán)中執(zhí)行協(xié)程。 以下Python腳本是并行處理某些任務(wù)的示例。

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

執(zhí)行上面示例代碼,得到以下結(jié)果 -

Tasks Completed
Processing 0
Processing 1
Processing 2
Processing 3
Processing 4
Processing 5
Processing 6
Processing 7
Processing 8
Processing 9

傳輸

Asyncio模塊提供了用于實(shí)現(xiàn)各種類型通信的傳輸類。 這些類不是線程安全的,并且在建立通信通道后總是與協(xié)議實(shí)例配對(duì)。

以下是從BaseTransport繼承的不同類型的傳輸 -

  • ReadTransport - 這是只讀傳輸?shù)慕涌凇?/li>
  • WriteTransport - 這是用于只寫傳輸?shù)慕涌凇?/li>
  • DatagramTransport - 這是發(fā)送數(shù)據(jù)的接口。
  • BaseSubprocessTransport - 與BaseTransport類相似。

以下是BaseTransport類的五種不同方法,它們隨后在四種BaseTransport類有不同的變型 -

  • close() - 關(guān)閉運(yùn)輸。
  • is_closing() - 如果傳輸正在關(guān)閉或者已經(jīng)是closed.transports,則此方法將返回true
  • get_extra_info(name,default = none) - 這會(huì)給一些關(guān)于傳輸?shù)念~外信息。
  • get_protocol() - 此方法將返回當(dāng)前協(xié)議。

協(xié)議
Asyncio模塊提供了可以繼承的基類,以實(shí)現(xiàn)您的網(wǎng)絡(luò)協(xié)議。 這些類與運(yùn)輸一起使用; 該協(xié)議解析傳入數(shù)據(jù)并要求寫入傳出數(shù)據(jù),而傳輸負(fù)責(zé)實(shí)際的I/O和緩沖。 以下是三種Protocol類 -

  • Protocol - 這是實(shí)現(xiàn)用于TCP和SSL傳輸?shù)牧鲄f(xié)議的基類。
  • DatagramProtocol - 這是實(shí)現(xiàn)用于UDP傳輸?shù)臄?shù)據(jù)報(bào)協(xié)議的基類。
  • SubprocessProtocol - 這是實(shí)現(xiàn)通過一組單向管道與子進(jìn)程通信的協(xié)議的基類。