【问题标题】:Integrating with deluged api - twisted deferred与泛滥的 api 集成 - 扭曲延迟
【发布时间】:2012-11-22 15:49:33
【问题描述】:

我有一个非常简单的脚本来监控文件传输进度,将其实际大小与目标进行比较,然后计算其哈希值,与所需的哈希值进行比较,并在一切正常时启动一些额外的东西。

我已将用于文件传输的工具 (wget) 替换为 deluged,它有一个简洁的 api 可以与之集成。

我不需要比较文件进度和哈希值,我现在只需要知道什么时候完成下载文件。为了实现这一点,我能够根据自己的需要修改 this script,但我被困在试图将我的头包裹在被淹没的扭曲框架上。

为了尝试克服它,我从twisted deferred documentation 中获取了一个示例脚本,围绕它包装了一个类,并尝试使用我在我提到的这个脚本中使用的相同概念。

现在,我不知道如何处理 reactor 对象,因为它基本上是一个无法重新启动的阻塞循环。

这是我正在使用的示例代码:

from twisted.internet import reactor, defer
import time

class DummyDataGetter:
    done = False
    result = 0
    def getDummyData(self, x):
        d = defer.Deferred()
        # simulate a delayed result by asking the reactor to fire the
        # Deferred in 2 seconds time with the result x * 3
        reactor.callLater(2, d.callback, x * 3)
        return d

    def assignResult(self, d):
        """
        Data handling function to be added as a callback: handles the
        data by printing the result
        """
        self.result = d
        self.done = True
        reactor.stop()

    def run(self):

        d = self.getDummyData(3)
        d.addCallback(self.assignResult)

        reactor.run()

getter = DummyDataGetter()
getter.run()
while not getter.done:
    time.sleep(0.5)
print getter.result
# then somewhere else I want to get dummy data again

getter = DummyDataGetter()
getter.run() #this throws an exception of type error.ReactorNotRestartable
while not getter.done:
    time.sleep(0.5)
print getter.result

我的问题是:

  1. 是否应该在另一个线程中触发 reactor 以防止它阻塞代码?

  2. 如果是这样,我将如何向这个位于单独线程中的反应器添加更多回调?只需在我的主线程中执行类似于reactor.callLater(2, d.callback, x * 3) 的操作?

  3. 如果不是,有什么技术可以解决无法在同一进程中启动/停止反应器两次或更多次的问题?

【问题讨论】:

  • 好吧,单独的线程方法部分工作,我得到了一些例外。我想我将不得不使用这个新范例从头开始我的脚本,而不是尝试将它合并到我现有的代码中。
  • 使用单独的线程几乎肯定是错误的,但是这个问题的措辞非常模糊。这个脚本是如何运行的?它是作为洪水的一部分运行的吗?如果是这样,那么运行反应器是错误的解决方案。
  • 它是一个作为新贵服务启动的脚本,在永无止境的循环中运行,它不是泛滥的一部分。它通过将 .torrent 文件下载到由 deluged 监控的目录来开始下载,并持续监控每次下载,以便将 sqlite3 数据库中的 complete 标志设置为 true。因此,我想我最终将不得不更改它,以便重构是我的循环,而不是增加 while true: 循环。
  • 那么反应器就是你的循环,你的意思是?
  • 是的,我就是这个意思。谢谢=]

标签: python twisted


【解决方案1】:

好的,我发现的最简单的方法是简单地使用subprocess.Popen 调用一个单独的脚本,将种子的状态和其他任何需要的内容转储到标准输出(使用 JSON 序列化)并将其通过管道传输到调用脚本中。

比学习扭曲的创伤要少,但当然远非最佳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    相关资源
    最近更新 更多