开发手册 欢迎您!
软件开发者资料库

事件驱动编程

Python中的并发事件驱动编程 - 从简单而简单的步骤学习Python中的并发性从基本到高级概念,包括简介,并发与并行,系统和内存架构,线程,线程实现,同步线程,线程互通,测试,调试线程应用程序,基准测试和分析,线程池,进程池,多处理,进程交互,事件驱动,反应式编程。

事件驱动编程侧重于事件.最终,程序的流程取决于事件.到目前为止,我们处理顺序或并行执行模型,但具有事件驱动编程概念的模型称为异步模型.事件驱动的编程取决于始终侦听新传入事件的事件循环.事件驱动编程的工作取决于事件.一旦事件循环,然后事件决定执行什么以及以什么顺序执行.以下流程图将帮助您了解其工作原理和减号;

Driven

Python模块 -  Asyncio

在Python 3.4中添加了Asyncio模块,它提供了使用协同例程编写单线程并发代码的基础结构.以下是Asyncio模块使用的不同概念 :

事件循环

事件循环是一种处理所有事件的功能计算代码.它在整个程序的执行过程中发挥作用,并跟踪事件的传入和执行. Asyncio模块允许每个进程单个事件循环.以下是Asyncio模块提供的一些方法来管理事件循环 :

  • loop = get_event_loop() : 此方法将为当前上下文提供事件循环.

  • loop.call_later(time_delay,callback,argument) : 此方法安排在给定的time_delay秒之后调用的回调.

  • loop.call_soon(回调,参数)  : 去;此方法安排尽快调用的回调. call_soon()返回后以及控件返回事件循环时调用回调.

  • loop.time() :  ;此方法用于根据事件循环的内部时钟返回当前时间.

  • asyncio.set_event_loop() : 此方法将当前上下文的事件循环设置为循环.

  • asyncio.new_event_loop() : 此方法将创建并返回一个新的事件循环对象.

  • loop.run_forever() : 此方法将一直运行,直到调用stop()方法.

示例

以下示例事件循环有助于使用get_event_loop()方法打印 hello world .这个例子来自Python官方文档.

import asynciodef 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

Futures

这与并发.futures.Future类兼容,该类表示尚未完成的计算。 asyncio.futures.Future和并发.futures.Future之间存在以下差异:

  • result()和exception()方法不会使用超时参数,并且在未完成操作时会引发异常。

  • 始终通过事件循环的call_soon()调用在add_done_callback()中注册的回调。

  • asyncio.futures.Future类与并发.futures包中的wait()和as_completed()函数不兼容。

Example

以下是一个示例,它将帮助您了解如何使用asyncio.futures.future类。

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

Output

Future Completed

Coroutines

Asyncio中的协程的概念类似于线程模块下的标准Thread对象的概念。 这是子例程概念的概括。 协程可以在执行期间挂起,以便等待外部处理,并从外部处理完成时停止的位置返回。 以下两种方法可以帮助我们实现协同程序:

async def function()

这是在Asyncio模块下实现协程的一种方法。 以下是相同的Python脚本:

import asyncioasync def Myoperation():   print("First Coroutine")loop = asyncio.get_event_loop()try:   loop.run_until_complete(Myoperation())finally:   loop.close()

Output

First Coroutine

@asyncio.coroutine decorator

实现协程的另一种方法是使用带有@ asyncio.coroutine装饰器的生成器。 以下是相同的Python脚本:

import asyncio@asyncio.coroutinedef Myoperation():   print("First Coroutine")loop = asyncio.get_event_loop()try:   loop.run_until_complete(Myoperation())finally:   loop.close()

Output

First Coroutine

Tasks

Asyncio模块的此子类负责以并行方式在事件循环内执行协程。 以下Python脚本是并行处理某些任务的示例。

import asyncioimport timeasync 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()

Output

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

Transports

Asyncio模块提供用于实现各种通信类型的传输类。 这些类不是线程安全的,并且在建立通信通道后始终与协议实例配对。

以下是从BaseTransport继承的不同传输类型:

  • ReadTransport :这是只读传输的接口。

  • WriteTransport :这是只写传输的接口。

  • DatagramTransport :这是用于发送数据的接口。

  • BaseSubprocessTransport :类似于BaseTransport类。

以下是BaseTransport类的五个不同方法,这些方法随后在四种传输类型之间都是瞬态的:

  • close():它关闭了运输。

  • is_closing():如果传输正在关闭或已经关闭,则此方法将返回true。

  • get_extra_info(name, default = none) :这将为我们提供有关运输的更多信息。

  • get_protocol() :此方法将返回当前协议。

Protocols

Asyncio模块提供了基类,您可以将其子类化以实现网络协议。 这些类与传输一起使用; 协议解析传入的数据并要求写入传出的数据,而传输负责实际的I / O和缓冲。 以下是三类协议:

  • Protocol :  这是实现用于TCP和SSL传输的流协议的基类。

  • DatagramProtocol :这是用于实现与UDP传输一起使用的数据报协议的基类。

  • SubprocessProtocol : 这是用于实现通过一组单向管道与子进程进行通信的协议的基类。