2016-03-30 12 views
0

Ich erstellte Uploader von Tornadoweb auf einen anderen Server. Es blockiert den Prozess also muss ich warten, bis alle Upload-Prozess eine andere URL (ShowQueue Klasse) für den Zugriff auf fertig dies ist mein CodeTornadoweb Upload auf einen anderen Server Blocking-Prozess

def create_callback(encoder,fileurl): 
     encoder_len = encoder.len 
     queueupload[fileurl] = {} 
     queueupload[fileurl]["size"] = encoder_len 

     def callback(monitor): 
      queueupload[fileurl]["current"] = monitor.bytes_read 
      # print queueupload 
      # bar.show(monitor.bytes_read) 
     return callback 

class ShowQueue(tornado.web.RequestHandler): 
    @gen.coroutine 
    def get(self): 
     self.write(tornado.escape.json_encode({'success':True,'queuelist':queueupload})) 

class UploadFile(tornado.web.RequestHandler): 
    @gen.coroutine 
    def get(self): 
     fileurl=self.get_argument("fileurl", None) 
     taxo=self.get_argument("taxonomi", None) 
     try: 
      filename = fileurl.split("\\")[-1] 
      # print filename 
      encoder = MultipartEncoder({ 
       'taxonomi': taxo, 
       'myFile': (filename, open(fileurl, 'rb'), 'text/plain'), 
       }) 

      callback = create_callback(encoder,fileurl) 
      monitor = MultipartEncoderMonitor(encoder, callback) 
      if(taxo!=""): 
       arrtaxo = taxo.split("/") 
       taxo = ":".join(arrtaxo) 
       taxo = "/"+taxo 
      r = requests.post('http://192.168.123.123:8080/upload'+taxo, data=monitor, 
           headers={'Content-Type': monitor.content_type}) 
      if fileurl in queueupload: 
       del queueupload[fileurl] 
      self.write(tornado.escape.json_encode({'success':True,'reason':r.json()})) 
     except Exception as e: 
      exc = 'Exception: %s %s' % (e, filename) 
      self.set_status(500) 
      self.write(json_encode({'success':False,'exception':exc})) 

Wie erstelle ich Uploader Arbeit asynchron ohne alle Prozess zu blockieren und haben immer noch die Kontrolle zu abbrechen (Ich verwende Callback, um den Prozess abzubrechen, aber noch nicht implementiert)?

Antwort

0

Die "Anfragen" -Bibliothek ist nicht für Tornado gebaut; Es ist nicht asynchron. Verwenden Tornado eigenen AsyncHTTPClient statt:

http://www.tornadoweb.org/en/latest/httpclient.html#tornado.httpclient.AsyncHTTPClient

http_client = AsyncHTTPClient() 
r = yield http_client.fetch(url, method="post", ...) 
+0

I verwenden mit offenem (fileURL, 'r') als f: body = f.read() response = Ausbeute httpclient.AsyncHTTPClient() .fetch ('http://192.168.174.129:8080/upload'+taxo,method= "POST", Header = {"Inhaltstyp": "text/plain"}, body = {"myFile": body}) aber ich habe Fehler erhalten Ausnahme: Erwartete Bytes, Unicode oder None; bekam