与淹没的api整合 - 扭曲延迟

时间:2012-11-22 15:49:33

标签: python twisted

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

我已经将用于文件传输的工具(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. 如果没有,那么解决这个问题的技术是什么?无法在同一过程中启动/停止反应堆两次或更多次?

1 个答案:

答案 0 :(得分:0)

好的,我发现最简单的方法是简单地使用一个名为subprocess.Popen的脚本,将所有种子的状态转储到stdout中(使用JSON序列化)并将其输入到调用中脚本。

比学习扭曲更少创伤,但当然远离最佳。