跳转到主要内容

Plone的实验性非阻塞future

项目描述

collective.futures

https://secure.travis-ci.org/datakurre/collective.futures.png

这是一个为Plone提供异步(非阻塞)处理方式的集体包。

这次我们谈论的是承诺和future:承诺是异步运行的函数,它们按需提供作为未来结果的值以供您的代码附加。

与其他替代方案的主要区别是,这不需要任何额外的服务,只需在Zope实例之上运行Plone即可。

一个主要限制是,异步执行的代码不能以任何方式访问数据库(或者您可能会遇到意外的后果)。此外,这也不会带来HAProxy和固定数量的当前请求每实例的好处。

示例

from Products.Five.browser import BrowserView

from collective import futures


def my_async_task(*args):
    # a lot of time consuming async processing
    return u'my asynchronously computed value'


class MyView(BrowserView):

    def __call__(self, *args):
        try:
            return futures.result('my_unique_key')
        except futures.FutureNotSubmittedError:
            futures.submit('my_unique_key', my_async_task, *args)
            return u'just a placeholder value'

from Products.Five.browser import BrowserView

from collective import futures


def my_async_task(*args):
    # a lot of time consuming async processing
    return u'my asynchronously computed value'


class MyView(BrowserView):

    def __call__(self, *args):
        return futures.resultOrSubmit(
            'my_unique_key', u'placeholder value', my_async_task, *args)

解释

此包使用的方法,将单个请求分割成两个独立的步骤

每当某些附加代码需要异步计算某个值时,它首先尝试请求一个命名的未来结果,然后仅提交一个承诺函数来为该未来计算结果。

如果提交了任何未来,则初始响应永远不会发布,而是当前事务被中止,提交的承诺函数在默认Zope线程之外(甚至在并行进程中)并行执行,并收集其返回值(请参阅Python中concurrent.futures的文档)。

当所有承诺函数都得到解决时,原始请求被克隆,解析的值被设置为未来,并分派一个新的内部请求。

在这个第二步之后,附加代码可以使用现在可用的未来,不再提交更多未来,并最终,将响应发布到浏览器。


更多背景信息: http://datakurre.pandala.org/2014/05/asynchronous-stream-iterators-and.html

更改日志

0.9.3 (2018-09-05)

  • 修复plone.protect尝试将PromiseWorkerStreamIterator解析为xml的问题 [datakurre]

0.9.2 (2018-06-29)

  • 在futures中添加日志异常,以获取完整的异常堆栈跟踪 [datakurre]

0.9.1 (2016-05-25)

  • 修复了已解析的futures未传递给嵌套请求的问题 [datakurre]

0.9.0 (2014-10-23)

  • 第一个版本。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

collective.futures-0.9.3.tar.gz (9.0 kB 查看哈希)

上传时间

构建分发

collective.futures-0.9.3-py2-none-any.whl (15.7 kB 查看哈希)

上传时间 Python 2

支持