2014-02-20 3 views
0

Я пытаюсь создать службу загрузки файлов с помощью Tornado.Загрузка файла торнадо

Но я заметил, что, когда несколько пользователей загружают файлы, торнадо ждет завершения первого и следующего процесса.

Каков правильный способ загрузки файлов ASYNC на Tornado?

Мой пост:

@tornado.web.asynchronous 
    def post(self): 
    list_of_img = ['png','jpg','jpeg','gif'] 
    list_of_files = ['rtf','txt','ppt','pptx','doc','docx','pdf','xls','xlsx','rar','zip','tgz','bz','gz','tar','bz2','3gp','mp4','m15','avi','mp3'] 
    path = __UPLOADS__ 
    try: 
     fileinfo = self.request.files['file'][0] 
     filebody = fileinfo['body'] 
     filename = fileinfo['filename'] 
     filetype = fileinfo['content_type'] 
     extn  = os.path.splitext(filename)[1] 

     n_filename = str(uuid.uuid4()) + extn 

     # rcv file 
     print "saving", n_filename + "..." 
     output_file = open(n_filename, 'w') 
     output_file.write(filebody) 

     # upload to s3 
     print "uploading", n_filename + "..." 

     self.upload(path, n_filename) 

     # clean up 
     print "cleaning", n_filename + "..." 
     self.delete_local(n_filename) 

     self.finish(n_filename) 
    except KeyError, key: 
     delete = self.get_argument("delete", None, True) 
     if delete: 
     filename = self.get_argument("filename", None, True) 

     print "deleting", filename + "..." 
     self.delete(path, filename) 

     self.finish(filename) 

ответ

0

@asynchronous декоратор должен использоваться для обозначения метода, который уже асинхронный; это не сделать метод асинхронный. Этот метод post является синхронным, потому что он делает все, что он собирается сделать, прежде чем возвращать управление IOLoop. Вам нужно сделать асинхронный метод upload() (что обычно означает, что он либо примет аргумент обратного вызова, либо вернет Future), а затем вызовет его без блокировки от post() (рекомендую использовать декоратор @gen.coroutine и вызывать медленные операции, получая возвращаемые Futures) ,

+0

Как это правильно сделано? – majidarif

+0

Это большой вопрос. Вы должны идентифицировать все блокирующие части системы и заменить их неблокирующими эквивалентами. Обычно это означает, что вы не можете использовать какие-либо сетевые библиотеки, кроме тех, которые предназначены для использования асинхронно. Здесь нет бесплатного обеда; изменение интерфейса - это то, что значит быть асинхронным. –

+0

серьезно. Это обычная проблема и не может найти лучший подход для обработки загрузки файла aync. BTW, полезно найти несколько вопросов, прежде чем писать свое приложение на торнадо. –

0

Gevent (Greenlets) - бесплатный способ обеда, чтобы обратиться к деталям BLocking.

from gevent import monkey 
monkey.patch_all() 

Но осторожно, когда-то это ломает вещи.

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