Commit f9cca5bb7a03b8bdd4f77426f3e7e96eb2ef0b68
1 parent
46132ce0
Exists in
master
and in
1 other branch
- fixed serve.py to work with tornado 5.0
Showing
1 changed file
with
15 additions
and
19 deletions
Show diff stats
serve.py
| ... | ... | @@ -7,17 +7,15 @@ import base64 |
| 7 | 7 | import uuid |
| 8 | 8 | import logging.config |
| 9 | 9 | import argparse |
| 10 | -from concurrent.futures import ThreadPoolExecutor | |
| 11 | 10 | import mimetypes |
| 12 | 11 | import signal |
| 12 | +import asyncio | |
| 13 | 13 | |
| 14 | 14 | # user installed libraries |
| 15 | 15 | import tornado.ioloop |
| 16 | 16 | import tornado.web |
| 17 | 17 | import tornado.httpserver |
| 18 | -from tornado import template, iostream, gen | |
| 19 | -from tornado.concurrent import run_on_executor | |
| 20 | -from tornado.platform.asyncio import to_tornado_future | |
| 18 | +from tornado import template, iostream | |
| 21 | 19 | |
| 22 | 20 | # this project |
| 23 | 21 | from learnapp import LearnApp |
| ... | ... | @@ -79,11 +77,14 @@ class LoginHandler(BaseHandler): |
| 79 | 77 | self.render('login.html', error='') |
| 80 | 78 | |
| 81 | 79 | # @gen.coroutine |
| 82 | - def post(self): | |
| 80 | + async def post(self): | |
| 83 | 81 | uid = self.get_body_argument('uid') |
| 84 | 82 | pw = self.get_body_argument('pw') |
| 85 | 83 | |
| 86 | - if self.learn.login(uid, pw): | |
| 84 | + loop = asyncio.get_event_loop() | |
| 85 | + login_ok = await loop.run_in_executor(None, self.learn.login, uid, pw) | |
| 86 | + | |
| 87 | + if login_ok: | |
| 87 | 88 | self.set_secure_cookie("user", str(uid), expires_days=30) |
| 88 | 89 | self.redirect(self.get_argument("next", "/")) |
| 89 | 90 | else: |
| ... | ... | @@ -179,14 +180,13 @@ class FileHandler(BaseHandler): |
| 179 | 180 | chunk = f.read(self.chunk_size) |
| 180 | 181 | while chunk: |
| 181 | 182 | try: |
| 182 | - self.write(chunk) # write the cunk to response | |
| 183 | + self.write(chunk) # write the chunk to response | |
| 183 | 184 | await self.flush() # flush the current chunk to socket |
| 184 | 185 | except iostream.StreamClosedError: |
| 185 | 186 | break # client closed the connection |
| 186 | 187 | finally: |
| 187 | 188 | del chunk |
| 188 | - await gen.sleep(0.000000001) # 1 nanosecond (hack) | |
| 189 | - # FIXME in the upcomming tornado 5.0 use `await asyncio.sleep(0)` instead | |
| 189 | + await asyncio.sleep(0) # 1 nanosecond (hack) | |
| 190 | 190 | chunk = f.read(self.chunk_size) |
| 191 | 191 | |
| 192 | 192 | |
| ... | ... | @@ -194,8 +194,6 @@ class FileHandler(BaseHandler): |
| 194 | 194 | # respond to AJAX to get a JSON question |
| 195 | 195 | # ---------------------------------------------------------------------------- |
| 196 | 196 | class QuestionHandler(BaseHandler): |
| 197 | - executor = ThreadPoolExecutor() # max_workers=5*n_cpus? | |
| 198 | - | |
| 199 | 197 | templates = { |
| 200 | 198 | 'checkbox': 'question-checkbox.html', |
| 201 | 199 | 'radio': 'question-radio.html', |
| ... | ... | @@ -212,12 +210,6 @@ class QuestionHandler(BaseHandler): |
| 212 | 210 | # 'alert': '', FIXME |
| 213 | 211 | } |
| 214 | 212 | |
| 215 | - # Blocking function to be run on the executor | |
| 216 | - @run_on_executor() | |
| 217 | - def check_answer(self, user, answer): | |
| 218 | - return self.learn.check_answer(user, answer) | |
| 219 | - | |
| 220 | - | |
| 221 | 213 | # --- get question to render |
| 222 | 214 | @tornado.web.authenticated |
| 223 | 215 | def get(self): |
| ... | ... | @@ -255,7 +247,10 @@ class QuestionHandler(BaseHandler): |
| 255 | 247 | answer = answer[0] |
| 256 | 248 | |
| 257 | 249 | # check answer in another thread (nonblocking) |
| 258 | - grade = await to_tornado_future(self.check_answer(user, answer)) | |
| 250 | + loop = asyncio.get_event_loop() | |
| 251 | + grade = await loop.run_in_executor(None, self.learn.check_answer, user, answer) | |
| 252 | + | |
| 253 | + print('grade = ', grade) | |
| 259 | 254 | question = self.learn.get_student_question(user) |
| 260 | 255 | |
| 261 | 256 | if grade <= 0.999: # wrong answer |
| ... | ... | @@ -277,7 +272,8 @@ class QuestionHandler(BaseHandler): |
| 277 | 272 | }) |
| 278 | 273 | else: # right answer, get next question in the topic |
| 279 | 274 | template = self.templates[question['type']] |
| 280 | - question_html = self.render_string(template, question=question, md=md_to_html) | |
| 275 | + question_html = self.render_string( | |
| 276 | + template, question=question, md=md_to_html) | |
| 281 | 277 | self.write({ |
| 282 | 278 | 'method': 'new_question', |
| 283 | 279 | 'params': { | ... | ... |