2015-06-02 60 views
8

在线程中,我们有一个名为“线程上下文”的东西,我们可以在其中保存一些数据(状态)以便在特殊线程中访问。在asyncio中,我需要在当前执行路径中保存一些状态,以便所有后续的协程都可以访问它。解决办法是什么? 注意:我知道每个协程函数都为asyncio中的执行路径实例化,但出于某种原因,我无法在函数属性中保存状态。 (虽然这种方法反正不是很好)Python asyncio context

+0

[This python-ideas thread](https://mail.python .org/pipermail/python-ideas/2015-April/033151.html)和[此asyncio错误报告](https://github.com/python/asyncio/issues/165)似乎相关。 – dano

+0

'curio'似乎有它https://github.com/dabeaz/curio/pull/85 –

回答

7

你可以看看tasklocals library。它引入了tasklocals.local,如threading.local多线程。

+0

感谢哥们!我检查了源代码,发现我错过的魔法:Task.current_task() – Kamyar

+0

这段代码是否与最近的Python版本兼容,因为这个库已经多年没有更新过了? –

+0

是的,它是兼容的 –

0

还有https://github.com/azazel75/metapensiero.asyncio.tasklocal,但你必须知道的任务往往是由图书馆还通过使用ensure_future(a_coroutine)而且也跟踪这些新的任务和初始化它们的当地人(也许这些任务没有实际的办法ASYNCIO内部创建的,他们从创建)。 (一个“黑客”来对子级设置loop.set_task_factory()功能的东西,没有工作,希望所有的代码使用loop.create_task()创建任务,这并非总是如此...)

的另一个问题是,如果你的一些代码在未来回调Task.current_task()函数中执行,这两个函数库都使用这两个函数库来选择正确的本地服务副本将始终返回None ...