Skip to main content

Plone 的实验性非阻塞期货

项目描述

集体期货

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

这是一个集体包,用于提供另一种在 Plone 上进行异步(非阻塞)处理的方法。

这一次我们谈论承诺和未来:承诺是异步运行的函数,它提供它们的结果作为附加代码的请求未来。

任何其他替代方案的主要区别在于,这不需要任何额外的服务,而只需要在 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的文档)。

当所有的 Promise 函数都被解析后,原始请求被克隆,解析后的值被设置为期货,并分派一个新的内部请求。

在第二遍之后,附加代码可以使用现在可用的期货,而不是提交更多期货,最后,响应一直发布到浏览器。


更多背景信息: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)

  • 添加到期货中的日志异常以获取完整的异常堆栈跟踪 [datakurre]

0.9.1 (2016-05-25)

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

0.9.0 (2014-10-23)

  • 第一次发布。

项目详情


下载文件

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

源分布

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

已上传 source

内置分布

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

已上传 py2