plone的实验性无阻塞期货
collective.futures的Python项目详细描述
集体期货
这是提供另一个 在plone上进行异步(非阻塞)处理的方法。
这次我们谈的是承诺和未来: promises是异步运行的函数,它提供 他们的结果是为你的代码添加期货。
其他选择的一个主要区别是 不需要任何附加服务,但只需要 扑通一声在Zope实例上运行。
一个主要的限制是异步执行的 代码无法以任何方式访问数据库(或者 面临意想不到的后果)。而且,这不会带来任何好处 具有haproxy和固定数量的每个实例当前请求。
示例
fromProducts.Five.browserimportBrowserViewfromcollectiveimportfuturesdefmy_async_task(*args):# a lot of time consuming async processingreturnu'my asynchronously computed value'classMyView(BrowserView):def__call__(self,*args):try:returnfutures.result('my_unique_key')exceptfutures.FutureNotSubmittedError:futures.submit('my_unique_key',my_async_task,*args)returnu'just a placeholder value'
或
fromProducts.Five.browserimportBrowserViewfromcollectiveimportfuturesdefmy_async_task(*args):# a lot of time consuming async processingreturnu'my asynchronously computed value'classMyView(BrowserView):def__call__(self,*args):returnfutures.resultOrSubmit('my_unique_key',u'placeholder value',my_async_task,*args)
解释
这个包使用的方法是 请求分成两个单独的过程:
每当一些附加代码 需要异步计算一个值,它 尝试先请求命名的未来结果,然后才请求 提交一个promise函数来计算将来的结果。
如果提交了任何期货,最初的答复是 已发布,但当前事务被中止 提交的承诺函数在 与默认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格式 [数据库]
0.9.2(2018-06-29)
- 添加到记录未来中的异常以获取完整的异常堆栈跟踪 [数据库]
0.9.1(2016-05-25)
- 修复嵌套请求未传递已解决的未来的问题 [数据库]
0.9.0(2014-10-23)
- 第一次释放。