处理同步函数或方法(如特殊方法)的协程

metapensiero.asyncio.transaction的Python项目详细描述


author:Alberto Berti
contact:alberto@metapensiero.it
license:GNU General Public License version 3 or later

处理同步函数或方法(如特殊方法)的协程。

目标

当有副作用时,这个包有助于处理这种情况 它被编码为协同程序,而需要它的代码块不能 作为一个联程跑。

例如,当从外部包调用协同程序时 或者python的特殊方法。

这个包将为您提供工具,以确保即使 计算不是立即的,协同程序的执行是 保证在调用的协同程序的上下文中发生 特殊方法。

与此同时工作的包是metapensiero.signal

安装

要安装软件包,请执行以下命令:

$ pip install metapensiero.asyncio.transaction

使用量

给定一个场景,其中从^{tt1}调用协程$ 方法,这是如何处理这种情况的:

importasynciofrommetapensiero.asyncimporttransaction@asyncio.coroutinedefpublish(value):# do something asyncclassExample:def__setattr__(self,name,value):trans=transaction.get()trans.add(publish(value))super().__setattr__(name,value)@asyncio.coroutinedefexternal_coro():inst=Example()trans=transaction.begin()inst.foo='bar'yield fromtrans.end()

在python 3.5中,external_coro可以写成:

asyncdefexternal_coro():inst=Example()asyncwithtransaction.begin():inst.foo='bar'

所以通过利用新的__aenter____aexit__ 方法和可等待的类。

协程将按创建的顺序安排。

在某一点上,您可能希望确保 协程执行完毕,您可以使用协程 transaction.wait_all(),这样做将结束所有剩余的打开 交易。

当代码向事务添加coro时,它还可以传递 callback作为cback关键字参数,因此当 隐藏的coro完成(或被取消)。这样你就可以使用 coro like的返回值:

importasynciofrommetapensiero.asyncioimporttransactionresults=[]@asyncio.coroutinedefstashed_coro():nonlocalresultsresults.append('called stashed_coro')return'result from stashed coro'classA:def__init__(self):tran=transaction.get()c=stashed_coro()tran.add(c,cback=self._init)def_init(self,stashed_task):nonlocalresultsresults.append(stashed_task.result())@asyncio.coroutinedefexternal_coro():tran=transaction.begin()# in py3.5# async with tran:#     a = A()a=A()yield fromtran.end()yield fromasyncio.gather(external_coro())assertlen(results)==2assertresults==['called stashed_coro','result from stashed coro']

测试

要运行测试,应在包根目录下运行以下命令:

python setup.py test

构建状态

https://travis-ci.org/azazel75/metapensiero.asyncio.transaction.svg?branch=master

更改

0.1(2015-12-15)

  • 来自岩石的改编。
  • 文件初稿。

0.2(2015-12-16)

  • 记录一些关于测试的细节。
  • 在end()上添加一些检查。

0.3(2015-12-26)

  • 固定包装。

0.4(2015-12-27)

  • 文档修复。

0.5(2016-01-22)

  • 修复从代码调用transaction.begin()时的行为 已经在执行任务。

0.6(2016-01-27)

  • 向事务添加coros时支持回调函数。

0.7(2016-02-18)

  • 添加wait()方法以在coros完成时挂起当前任务 不关闭当前交易记录。

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

推荐PyPI第三方库


热门话题
java我可以使用indexOf()在forloop中返回两个不同的值吗?   web服务如何在JavaSE环境中部署JAXRS应用程序?   java没有BigInteger的自动装箱?   java Casting和泛型,有什么性能差异吗?   JavaSpring安全性:登录身份验证控制器   java如何使用libgdx设置圆弧的厚度?   java在异常处理期间何时使用记录器?   java对startActivityForResult的响应   java为什么在选择联系人之前调用onActivityResult?   java如何在ApacheFelix上实现异步处理?   java异常字符串筛选器   java Tomcat Web应用程序管理器未列出已部署的应用程序   excel csv到xls,java中有65536行以上