面向软件工程师的并行程序设计

asyncframes的Python项目详细描述


asyncFrames是python的协同程序库,也是frame hierarchy programming model的参考实现。FHM的目标是帮助程序员设计干净且可伸缩的并行程序。 asyncFrames的主要功能是:

  • 分层代码设计
  • 固有的可伸缩并行性
  • 架构独立性
  • 通过帧类(其生存期绑定到帧执行的类)的可扩展性

简介

frame hierarchy programming model(fhm)中,程序被表示为frames的动态树。一个框架是一个可暂停的函数(一个协同程序),它只存在一个面向对象的上下文(框架类),直到函数返回为止。帧可以用来表示时间过程(使用协程)和物理或概念对象(使用帧类)。

每个跳频程序只有一个根帧。根帧可以递归生成子帧。每个子帧并行运行,除非它正在等待另一个帧或可等待的事件。类型为Frame的帧在单个线程上运行。他们使用协同多任务来模拟并行性。类型为PFrame的帧在事件循环的线程池中可用的任何线程上运行。FramePFrame是帧类。可以对它们进行子类化,以使用封装的数据创建专门的帧类。

安装

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)

  • 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java查找事件分派线程冲突   java画布。DrawBitmap()不会在安卓上绘制任何内容!!:(   ruby+appium或java+appium用于移动本机应用程序自动化   java Jersey REST字符编码   java使用json将字符串转换为Arraylist   java如何在Groovy中检查字符串是否与模式匹配   java如何在抽象arraylist中添加抽象arraylist   Java servlets,JSP更改内容od DIV   java在J2ME中通过http发送和接收数据,并处理菜单和屏幕   Jar文件与JAVA类路径的结合   java按钮不可见,它将连接安卓 studio中的另一个活动   java是否可以使用SFTP JSch库进行多部分文件上载?   facelet中ui:composition和ui:decoration的java差异   java得到的数字不能被任何东西除   java logback:SizeAndTimeBasedRollingPolicy不删除包含4位“%i”的文件   java数据库管理器将连接“借用”到数据库   java javaFx标签wrapText不起作用   java是否可以在同一个系统上同时运行两台服务器?或者,当XAMPP/WAMP未运行时,如何在Eclipse中执行MySQL查询?   递归Java编程