我有一个非常简单的脚本来监视文件传输进度,将其实际大小与目标进行比较,然后计算其哈希值,与所需的哈希值进行比较,并在一切正常时启动一些额外的东西。
我已将用于文件传输的工具 (wget) 替换为 deluged,它有一个简洁的 api 可以与之集成。
而不是比较文件进度和比较哈希值,我现在只需要知道何时完成下载文件。为了实现这一点,我能够根据自己的需要修改这个脚本,但是我一直在试图将我的头包裹在被淹没的扭曲框架上。
为了尝试克服它,我从扭曲的延迟文档中获取了一个示例脚本,围绕它包装了一个类,并尝试使用我在我提到的这个脚本中使用的相同概念。
现在,我不知道如何处理 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
我的问题是:
是否应该在另一个线程中触发 reactor 以防止它阻塞代码?
如果是这样,我将如何在一个单独的线程中向这个反应器添加更多回调?
reactor.callLater(2, d.callback, x * 3)只需从我的主线程中执行类似于, 的操作吗?如果不是,有什么技术可以克服不能在同一过程中启动/停止反应器两次或更多次的问题?