如何在Python 3.5中的异步方法调用之间传递上下文?

时间:2016-07-13 17:12:36

标签: async-await python-3.5 python-asyncio

如何在不使用方法参数的情况下将异步方法调用的上下文传递给另一个?

我需要这个功能来使用一种流ID来丰富日志消息,这样我就可以轻松地跟踪特定呼叫方法流的所有日志消息。

我使用Python的异步和等待关键字(Python 3.5.x)。

4 个答案:

答案 0 :(得分:1)

你应该使用Python 3.7中引入的Context Variables,我有一个Python的polyfill< 3.7为aiocontextvars

上一个回答:

  

您可能需要查看tasklocalsaiolocals

答案 1 :(得分:0)

我通过设置自定义task factory解决了这个问题。事实证明,每个任务的上下文(与每个异步调用的上下文相比)对我来说已经足够了。

答案 2 :(得分:0)

我正在研究aiotask-context package。这是在任务之间传递上下文的一种非常简单的方法(使用awaityield from调用)。如果你不想使用这个包,你仍然可以使用这个想法:)。

我正在研究如何为ensure_future来电传播它。

答案 3 :(得分:0)

import contextvars
c_id = contextvars.ContextVar("context_id", default=None)

def get_context_id():
    return c_id.get()

def set_context_id(value):
    c_id.set(value)

我为此付出了很多努力。如果仍然有人在寻找答案,那么他们可以在这里参考。可以从Python3.7开始使用。

  • 创建一个contextvars.ContextVar实例。
  • 您可以在此处提供上下文变量名称和该变量的默认值,如果在当前上下文中找不到该变量,将使用默认值。
  • 使用setter设置值,您可以在相同上下文中使用getter获得相同的值。
  • 一次在顶级级别定义ContextVar,而不是在闭包(即函数或类等)内部定义,因为上下文的垃圾回收是不正确的。