Plone 的实验性非阻塞期货
项目描述
集体期货
这是一个集体包,用于提供另一种在 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)
第一次发布。