[英]How to add timeout to Deferred from Twisted's deferToThread API?
[英]Integrating with deluged api - twisted deferred
我有一个非常简单的脚本,用于监视文件传输进度,将其实际大小与目标进行比较,然后计算其哈希值,与所需的哈希值进行比较,并在一切正常的情况下触发一些其他操作。
我已经用deluged替换了用于文件传输(wget)的工具,该工具具有可集成的简洁api。
无需比较文件进度和哈希值,我只需要现在就知道繁琐的下载完成时间。 为此,我可以根据需要修改此脚本 ,但是我一直努力将想法缠在被扭曲利用的扭曲框架周围。
为了尝试解决这个问题,我从扭曲的递延文档中获取了一个示例脚本,在其周围包装了一个类,并尝试使用我在上述脚本中使用的相同概念。
现在,我不确切知道如何处理反应堆对象,因为它基本上是一个无法重新启动的阻塞循环。
这是我正在使用的示例代码:
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.callLater(2, d.callback, x * 3)
?
如果不是,那么什么技术可以解决无法在同一过程中启动或停止反应器两次或更多次的问题?
好的,我发现的最简单的方法就是简单地使用subprocess.Popen
调用一个单独的脚本,将torrent的状态和其他所需的内容转储到stdout(使用JSON序列化)中,并将其通过管道传递到调用脚本中。
比学习扭曲更少的创伤,但当然远非最佳。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.