2017-11-22 7 views
0

토네이도가있는 비 차단 API를 작성하려고합니다. 하지만 로컬에서 시도 할 때 첫 번째 요청은 API를 차단합니다. 다른 브라우저를 사용하려고했지만 결과는 같습니다. 토네이도가 비동기 적으로 작동하지 않습니다.

내가 크롬과 파이어 폭스를 열었다. 크롬에 나는 http://localhost:8888/test-first을 가서로드하는 동안 나는 immediatly 파이어 폭스에서 http://localhost:8888/test-second 이동합니다. 다른 하나는 여전히로드하는 동안 나는 파이어 폭스에서 요청을 기대하고

는 응답 될 것입니다. 그러나 두 사람 모두 기다리고 있으며 첫 번째 요청이 끝나면 두 사람 모두 끝납니다.

내 코드 및 출력 :

기대 콘솔 출력 :

First request: 2017-11-22 22:23:22.093497 
Second request: 2017-11-22 22:23:24.580052 
Second answer: 2017-11-22 22:23:25.580509 
First answer: 2017-11-22 22:23:37.579263 

콘솔 출력

First request: 2017-11-22 22:23:22.093497 
First answer: 2017-11-22 22:23:37.579263 
Second request: 2017-11-22 22:23:37.580052 
Second answer: 2017-11-22 22:23:37.580509 

test_first.py :

,
import tornado.web 
import datetime 


class First(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    async def get(self): 
     print("First request: " + str(datetime.datetime.now())) 
     for _ in range(1000000000): 
      pass 
     self.set_status(200) 
     self.write("OK") 
     self.finish() 
     print("First answer: " + str(datetime.datetime.now())) 

test_second.py :

import tornado.web 
import datetime 


class Second(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    async def get(self): 
     print("Second request: " + str(datetime.datetime.now())) 
     self.set_status(200) 
     self.write("OK") 
     self.finish() 
     print("Second answer: " + str(datetime.datetime.now())) 

app.py :

import tornado 
from test_first import First 
from test_second import Second 


class Application(tornado.web.Application): 
    def __init__(self): 
     ENDPOINTS = [ 
      # USERS # 
      (r"/test-first", First), 
      (r"/test-second", Second) 
     ] 

     SETTINGS = { 
      "debug": True, 
      "autoreload": True, 
      "serve_traceback": True, 
      "compress_response": True 
     } 

     tornado.web.Application.__init__(self, ENDPOINTS, SETTINGS) 


if __name__ == "__main__": 
    print("dinliyor...") 
    Application().listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 

답변

2
for _ in range(1000000000): 
     pass 

이것은 CPU 집약적 인 작업입니다. 따라서 전체 서버를 차단합니다. 토네이도 및 거의 모든 비동기 라이브러리는 비동기 네트워크 I/O를 수행하기위한 것으로 데이터가 들어오고 데이터가 지나치게 많은 CPU 작업을 필요로하지 않습니다.

이 작업을 차단 바운드 CPU를 수행하려면, 당신은 서버를 차단하지 않도록 별도의 프로세스에서 실행, 또는 스레드해야합니다.

어쨌든 출력을 얻으려면 tornado.gen.sleep을 사용하여 First 처리기를 일시 중지 할 수 있습니다.

class First(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    async def get(self): 
     print("First request: " + str(datetime.datetime.now())) 

     await tornado.gen.sleep(5) # sleep for 5 seconds 

     self.set_status(200) 
     ... 
관련 문제