[英]Twisted Producer deferred write
在FTP服務器示例中,它使用IWriteFile,它期望使用者我現在正在緩存的代碼並將4mb的塊發送到服務器,但是生產者寫入似乎並不期望延遲,但是同步寫入可以安全地使用延遲?
碼
# Deals with giving the FTP Connection a FileConsumer then the File Consumer takes over
class EmailWriter(object):
implements(IWriteFile)
def __init__(self, filename):
print "EmailWriter: %s" % filename
self.filename = filename
self._receive = False
def receive(self):
assert not self._receive, "Can only call IWriteFile.receive *once* per instance"
self._receive = True
# FileConsumer will close the file object
self.consumer = EmailConsumer("user@gmail.com", "password", "gmail.com", "smtp.gmail.com", 587, self.filename)
return defer.succeed(self.consumer)
def close(self):
# signals that the upload is done
pass
# Writing Data
class EmailConsumer(object):
# implements
# Consumer
def __init__(self, path, server):
self.path = path
self.json_db = JsonDB(path)
self.server = server
self.indexes = {}
self.blocks = 0
self.start = False
self.stop = False
self.producer = None
self.streaming = None
def registerProducer(self, producer, streaming):
# start expecting data
assert (self.stop == False), "Cannot register multiple times..."
self.start = True
self.producer = producer
self.streaming = streaming
def unregisterProducer(self):
# stop expecting data
self.start = False
self.stop = True
self.producer = None
self.streming = None
def write(self, bytes):
# recieve data
self.buffer += bytes
if len(self.buffer) > BLOCK_SIZE:
self.blocks += 1
d = self.server.send_file(self.buffer)
d.addCallback(self._done_uploadng, hash(self.buffer), self.blocks)
self.buffer = ""
def self._done_uploadng(self, result, hash, block):
self.index[block] = (hash, self.server.account)
self.json_db.set_data("index", self.index)
return result
簡短的回答是,可以安全地返回Deferred。
Twisted.internet.interfaces.IConsumer中的文檔中還剩下另一個提示:
def write(data):
"""
The producer will write data by calling this method.
The implementation must be non-blocking and perform whatever
buffering is necessary. If the producer has provided enough data
for now and it is a L{IPushProducer}, the consumer may call its
C{pauseProducing} method.
"""
因此,我建議您使用self.producer.pauseProducing()和self.producer.resumeProducing()包裝對self.server.send_file()的調用。 這樣,您就不會以可重入的方式調用它,大文件可能會發生這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.