gpt4 book ai didi

python - 在扭曲中使用上下文

转载 作者:太空宇宙 更新时间:2023-11-04 10:29:04 24 4
gpt4 key购买 nike

我尝试使用 twisted.python.context,但是在第一个 deferToThread 之后上下文消失了。

from twisted.internet import reactor, defer, threads
from twisted.python import context

def _print_context(msg):
cont = context.get('cont')
print "{msg}: {context}".format(msg=msg, context=cont)

def sub_call():
_print_context("In sub_call")

@defer.inlineCallbacks
def with_context():
_print_context("before thread")
yield threads.deferToThread(sub_call)
_print_context("after thread")
reactor.stop()

def test():
cont = {'cont': "TestContext"}
context.call(cont, with_context)
reactor.callLater(0, test)
reactor.run()

我在 deferToThread 之前和 sub_call 中有上下文,但在 deferToThread 之后没有上下文。

deferToThread 之后有什么方法可以获取上下文吗?

最佳答案

context.call 在传递给它的对象的调用期间设置上下文 - 在本例中为 with_context

with_context 是一个 inlineCallbacks 包装的生成器函数。第一次调用它会创建一个新的生成器并将其迭代到第一个 yield 语句。然后它的执行被挂起,就调用者而言,调用返回。此时弹出上下文堆栈并丢弃您提供的上下文。

稍后,inlineCallbacks 的实现确保生成器将进一步迭代,以便执行 yield 语句之后的代码。但是,上下文已被丢弃。

没有简单的方法来解决这个问题。 twisted.python.context 并未尝试解决异步 上下文管理的问题。此外,twisted.python.context 相当糟糕,实际上应该编写任何程序来使用它。

我建议退后一步,重新评估您的选择。通过创建一个类并在其实例上使用实例属性在方法调用之间携带状态,您可能会得到更好的服务。

关于python - 在扭曲中使用上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27964146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com