2013-02-18 2 views
2

В примере с FTP-сервером он использует IWriteFile, который ожидает, что потребитель, который у меня сейчас есть, буферизует и отправляет 4-мегабайтные фрагменты на сервер, однако производитель пишет, похоже, не ожидает отложенной, но синхронной записи безопасно ли использовать отложенные?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(). Таким образом, вы не будете его вызывать в режиме повторного входа, что произойдет для большого файла.

Смежные вопросы