处理同步函数或方法(如特殊方法)的协程
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
更改
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完成时挂起当前任务 不关闭当前交易记录。