İpliklerin kesilmesi mümkün olmamakla birlikte, Ertelenmiş 10.1.0 ve sonraki sürümlerde kullanılabildiğini düşündüğüm cancel
işlevi ile ertelenebilir.
Deferred belirli bir süre sonra tetiklenmemişse belirli bir işlevi geri çağırmak için Deferreds yapmak için aşağıdaki sınıfı kullandım. OP'nin konusuyla aynı soruyu taşıyan bir kişi için yararlı olabilir.
DÜZENLEME: Aşağıdaki yorumların önerdiği gibi, defer.Deferred
'dan miras almamak en iyisidir. Bu nedenle, aynı efekti elde eden bir sarıcı kullanmak için kodu değiştirdim. Zaman aşımından önce
class DeferredWrapperWithTimeout(object):
'''
Holds a deferred that allows a specified function to be called-back
if the deferred does not fire before some specified timeout.
'''
def __init__(self, canceller=None):
self._def = defer.Deferred(canceller)
def _finish(self, r, t):
'''
Function to be called (internally) after the Deferred
has fired, in order to cancel the timeout.
'''
if ((t!=None) and (t.active())):
t.cancel()
return r
def getDeferred(self):
return self._def
def addTimeoutCallback(self, reactr, timeout,
callUponTimeout, *args, **kw):
'''
The function 'callUponTimeout' (with optional args or keywords)
will be called after 'timeout' seconds, unless the Deferred fires.
'''
def timeoutCallback():
self._def.cancel()
callUponTimeout(*args, **kw)
toc = reactr.callLater(timeout, timeoutCallback)
return self._def.addCallback(self._finish, toc)
Örnek geri arama: ve başka hiçbir "sözde"
from twisted.internet import reactor
from DeferredWithTimeout import *
dw = DeferredWrapperWithTimeout()
d = dw.getDeferred()
def testCallback(x=None):
print "called"
def testTimeout(x=None):
print "timedout"
d.addCallback(testCallback)
dw.addTimeoutCallback(reactor, 20, testTimeout, "to")
reactor.callLater(2, d.callback, "cb")
reactor.run()
Baskılar. callback'inde önce
Örnek zaman aşımı:
from twisted.internet import reactor
from DeferredWithTimeout import *
dw = DeferredWrapperWithTimeout()
d = dw.getDeferred()
def testCallback(x=None):
print "called"
def testTimeout(x=None):
print "timedout"
d.addCallback(testCallback)
dw.addTimeoutCallback(reactor, 20, testTimeout, "to")
reactor.run()
Baskılar 20 saniye sonra "süresi sona erdi" ve başka bir şey.
Gerçekten 'Deferred' alt sınıfını seçmemelisiniz. Bir alt sınıfı değil, bu işlevselliği ayrı bir yardımcı olarak uygulayın. http://pyvideo.org/video/1684/the-end-of-object-inheritance-the-beginning-of –
Alt sınıfları değil, olağan uyarılara ek olarak, "Deferred" bir * özellikle * kötü bir şeydir alt sınıf, çünkü davranışı kendi uygulamasıyla ilgili çok özel şeyler üstlenir ve belirli yöntemlerin geçersiz kılınmasına iyi tepki vermez. – Glyph
Bu videonun bağlantısı için teşekkürler! Kod tasarlama biçimimi tamamen değiştirdi. – Corey