面向软件工程师的并行程序设计
asyncframes的Python项目详细描述
asyncFrames是python的协同程序库,也是frame hierarchy programming model的参考实现。FHM的目标是帮助程序员设计干净且可伸缩的并行程序。 asyncFrames的主要功能是:
- 分层代码设计
- 固有的可伸缩并行性
- 架构独立性
- 通过帧类(其生存期绑定到帧执行的类)的可扩展性
简介
在frame hierarchy programming model(fhm)中,程序被表示为frames的动态树。一个框架是一个可暂停的函数(一个协同程序),它只存在一个面向对象的上下文(框架类),直到函数返回为止。帧可以用来表示时间过程(使用协程)和物理或概念对象(使用帧类)。
每个跳频程序只有一个根帧。根帧可以递归生成子帧。每个子帧并行运行,除非它正在等待另一个帧或可等待的事件。类型为Frame的帧在单个线程上运行。他们使用协同多任务来模拟并行性。类型为PFrame的帧在事件循环的线程池中可用的任何线程上运行。Frame和PFrame是帧类。可以对它们进行子类化,以使用封装的数据创建专门的帧类。
安装
asyncFrames可以通过pip
:
pip install asyncframes
asyncFrames需要一个事件循环来暂停执行,而不阻塞操作系统。默认事件循环是asyncframes.asyncio_eventloop.EventLoop。除了内置的asyncio包之外,它不依赖任何python包。 有些框架,比如qt,使用自己的事件循环。当使用这样的框架时,框架的事件循环应该通过实现asyncframes.AbstractEventLoop接口为asyncFrames重用。
示例
下面是使用asyncFrames的最小示例:
from asyncframes import Frame from asyncframes.asyncio_eventloop import EventLoop @Frame async def main_frame(): print("Hello World!") loop = EventLoop() loop.run(main_frame)
下面是挂起帧的示例:
from asyncframes import Frame, sleep from asyncframes.asyncio_eventloop import EventLoop @Frame async def main_frame(): for i in range(5): await sleep(1) print(i + 1) loop = EventLoop() loop.run(main_frame)
下面是并行运行两个帧的示例:
from asyncframes import Frame, sleep from asyncframes.asyncio_eventloop import EventLoop @Frame async def counter(c): for i in range(5): await sleep(1) print(c) @Frame async def main_frame(): a = counter('a') # Start counter 'a' await sleep(0.5) # Wait 0.5 seconds b = counter('b') # Start counter 'b' await (a & b) # Wait until both counters finish loop = EventLoop() loop.run(main_frame)
下面是使用并行帧(PFrame)并行运行两个阻塞操作的示例:
import time from asyncframes import Frame, PFrame, sleep from asyncframes.asyncio_eventloop import EventLoop @PFrame async def counter(c): for i in range(5): time.sleep(1) print(c) @Frame async def main_frame(): a = counter('a') # Start counter 'a' await sleep(0.5) # Wait 0.5 seconds b = counter('b') # Start counter 'b' await (a & b) # Wait until both counters finish loop = EventLoop() loop.run(main_frame)
更改日志
2.2.0(2019-02-18)
- 内联框架-使用python的“with”语法快速创建框架层次结构。
- lifebound awaitables-创建可等待的对象,当它们通过lifebound=true被移除时触发。
- 析构函数-通过重载ondispose()为任何可等待的或基元定义析构函数。
2.1.0(2019-01-07)
- gtk支持-使用glib eventloop创建gtk小部件。
2.0.0(2018-12-06)
- 多线程-使用pframe并行运行帧。
- 延迟启动-默认情况下,创建一个帧队列,然后立即执行并返回。
- 帧异常处理程序-异常沿帧层次结构传播,而不是沿等待帧传播。
- 简化事件-EventSource现在是事件的。等待的事件仅发出事件参数。
- 可取消的可用事件-通过将event.cancel设置为true来取消可用事件。
- 框架工厂-框架类的实例的类型为[MyFrameClass].factory。
- threadsafe post()-使用post()将任何线程上的事件排队,而不是单独的post&invoke函数。
- “singleshot”-事件参数“autoremove”已重命名为“singleshot”
1.1.0(2018-09-18)
- 线程安全事件-使用invoke()跨线程唤醒事件源。
- 自由事件-帧在移除之前发出self.free事件。
- 层次结构的变化-任何人和所有人都不会接管他们可期待的父母身份。
1.0.0(2018-09-05)
- 初始版本