gpt4 book ai didi

python - 在 Twisted 应用程序中使用延迟对象

转载 作者:太空狗 更新时间:2023-10-30 01:52:10 26 4
gpt4 key购买 nike

我觉得我在编写 Twisted 应用程序(.tac 文件)时不理解某些事情。在 .py 脚本中使用延迟对象很容易,只需在最后调用 reactor.run(),但我还没有看到 reactor.run() 在任何扭曲的应用程序中使用示例代码。

谁能解释一下:

  1. 为什么在扭曲的应用程序中不调用 reactor.run()(或者如果这是一个错误的结论)
  2. 我如何在扭曲的应用程序中使用延迟对象而不调用 reactor.run()
  3. 以及编写扭曲脚本与应用程序的一般差异。

最佳答案

1。为什么在示例 .tac 文件中未调用 reactor.run()

.tac 文件旨在由“twistd”命令行工具加载,该工具会为您运行 react 堆。

运行 react 堆是一次完成的事情,无论是作为程序要点的代码段。大多数 Twisted 代码实际上是某种插件,旨在在更大系统的上下文中运行。

.tac 文件的特殊情况下,它们永远不会作为独立的 Python 程序运行:它们的工作是生成一个 Application 对象(带有附加的一堆 Service 对象)在 react 堆运行时启动。重要的是 tac 文件本身不会自己做太多工作,因为(例如)有问题的 Service 实现可能需要分离需要运行特权和无特权,这是一个严格的过程;如果工作是在 .tac 本身中执行的,则可能会以错误的用户身份随意执行。

2。如何在不调用 reactor.run() 的情况下在 Twisted 应用程序中使用 Deferred

Deferred 只是一种管理回调链的机制。您不需要调用 reactor.run(),甚至根本不需要 react 堆,就可以使用它们。例如:

>>> from twisted.internet.defer import Deferred
>>> d = Deferred()
>>> def hello(result):
... print "'d' was fired:", result
... return result + 3
...
>>> d.addCallback(hello)
<Deferred at ...>
>>> print d
<Deferred at ...>
>>> d.callback(7)
'd' was fired: 7
>>> print d
<Deferred at ... current result: 10>

也就是说,许多返回 Deferred 的 API 需要 react 器做一些工作,以便最终调用 .callback()。例如,如果您这样做...

>>> from twisted.internet.task import deferLater
>>> from twisted.internet import reactor
>>> deferLater(reactor, 1.0, lambda: 20).addCallback(hello)
<Deferred at ...>
>>>

...除非有人运行 react 堆,否则您将永远坐在那里等待它开火。在此之前不会打印任何内容。

但是,如果 react 器已经在运行 - 例如,如果您在 python -m twisted.conch.stdio 而不是 python 中运行这个交互式示例,您会看到 Deferred 稍后被回调,因为该交互式提示已经在运行 react 堆。

3。 Twisted 脚本与应用程序之间有什么区别?

这些并不是真正正式的独立术语。任何 Python 脚本都可能从 Twisted 导入代码并以任何它想要的方式使用它,因此很难说任何特定的属性适用于“脚本”,除非它们是计算机程序:-)。

如果 Twisted Application 是指 .tac 文件或插件,区别在于这种代码被分离到构建服务的部分(顶层的代码您的 tac 文件或插件)和实际执行工作的部分(privilegedStartService/startService/stopService 实现顶级代码设置的服务)。此外,在此上下文中运行的代码(即由 twistd 驱动)不需要运行 react 器本身,因为 react 器将由 twistd 本身设置和运行。因此,此类代码还必须小心避免导入 twisted.internet.reactor,因为 twistd 提供了使用不同 react 器的能力( selectpollepollkqueue 等)并在 twistd 之前自己导入 reactor设置它的机会将破坏此功能。

关于python - 在 Twisted 应用程序中使用延迟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7880479/

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