2013-02-18 35 views
2

在FTP服務器示例中,它使用IWriteFile,它期望消​​費者獲得我現在具有的代碼緩衝區並向服務器發送4mb塊,但生產者寫入似乎並不期望延遲但是同步寫入使用延期是否安全?Twisted Producer延遲寫入

代碼

# 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("[email protected]", "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 

回答

1

簡短的回答是肯定的,其安全地返回推遲。

也有留在文檔中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.server.send_file(與self.producer.pauseProducing( )和self.producer.resumeProducing()。這樣你就不會以可重入的方式調用它,這將會發生在一個大文件上。