2017-10-01 9 views
0

Lorsque vous exécutez le code que je reçois une erreur deTornade de Python3 ne cède pas correctement?

ERROR:tornado.application:Future exception was never retrieved: Traceback (most recent call last): File "C:\Users\Ben\AppData\Local\Programs\Python\Python36\lib\site-packages\tornado\gen.py", line 1069, in run yielded = self.gen.send(value) File "C:\Users\Ben\Documents\GitHub\app-development\server\server.py", line 20, in serve self.write(r) File "C:\Users\Ben\AppData\Local\Programs\Python\Python36\lib\site-packages\tornado\web.py", line 708, in write raise RuntimeError("Cannot write() after finish()") RuntimeError: Cannot write() after finish()

Pourquoi est-ce qui se passe? J'ai référencé cela question (deuxième réponse) Je crois que j'utilise l'instruction de rendement correctement.

class MainHandler(tornado.web.RequestHandler): 
    executor = ThreadPoolExecutor(max_workers=64) 

    def get(self): 
     task = self.get_argument('task') 
     self.serve(task) 

    @tornado.gen.coroutine 
    def serve(self, task): 
     method = getattr(self, task) 
     r = yield method() 
     self.write(r) 

    @run_on_executor 
    def announcements(self): 
     time.sleep(5) 
     print("Done") 
     with open('announcements.json') as announce_data: 
      data = json.load(announce_data) 
     print(data) 
     return data 

Répondre

1

get doit aussi être un coroutine:

@gen.coroutine 
def get(self): 
    task = self.get_argument('task') 
    yield self.serve(task) 

En Tornado, seuls coroutines peuvent appeler coroutines.