2015-01-18 7 views
1

그래서 나는 비동기 코드를 작성하는 방법으로 조사되었고, 나는 아래의 코드와 함께 올라와있다 :설명하면서 파이썬 토네이도 비동기

나는 다음과 같은 두 가지 질문이 있습니다

  1. 우리가 어떻게 가정 할 수 있습니다 이 코드는 비동기입니까? 우리는 gen 모듈을 사용하면 비동기로 만듭니다 (당연히 gen coroutine을위한 비동기 모듈을 작성해야 함).
  2. 왜 토네이도가 하나의 메인 스레드를 포함합니까? 다른 스레드 풀에 링크되는 스레드 풀에 연결되는 메인 스레드를 가질 수 있습니까? 이 질문은 하나의 메인 스레드로 무엇을 성취 할 것인가?
from tornado import gen 
import tornado.web 
import tornado.ioloop 
import motor 

class MainHandler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    @gen.coroutine 
    def get(self): 
    post = yield db.user.find_one() 
    print post 
    self.write(post['name']) 

handlers=[(
(r'/', MainHandler) 
)] 

db = motor.MotorClient().example 

if __name__ == '__main__': 
    application = tornado.web.Application(handlers,debug=True) 
    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 

답변

4

Asynchronousness 인터페이스의 특성이며; 을 사용하면이 핸들러가 인터페이스를 변경하기 때문에 비동기로 충분합니다 (Future을 반환합니다.) 여기에 @asynchronous 데코레이터를 사용할 필요가 없습니다. Tornado 3.1부터 @coroutine만으로 충분합니다. 또한 Motor는 Futures을 반환하기 때문에 비동기이기도합니다.

블로킹구현의 속성입니다.; 여러분이 정말로 묻고있는 것은이 핸들러가 비 블로킹 (non-blocking)인지 여부입니다. 이것은 불행히도 더 까다로운 질문입니다. Motor의 문서에서 알 수 있듯이 비 블로킹 (non-blocking)으로 설계되었지만 실제로는 블로킹이 완전히 차단되지 않았 음을 확인하는 간단한 방법은 없습니다. http://www.tornadoweb.org/en/stable/guide/async.html에는 비동기 및 비 차단이라는 것이 무엇을 의미하는지에 대한 더 많은 논의가 있습니다.

토네이도는 단일 스레드 비 블로킹 시스템이 스레드 된 것보다 높은 성능을 얻을 수 있기 때문에 (특히 파이썬 GIL에 의해 부과 된 제한을 고려할 때), 비동기적인 모든 것을 비동기로 만드는 것은 복잡합니다. 스레드 안전 문제에 대해 일반적으로 걱정할 필요가 없다는 사실입니다.

0

비동기 코드를 작성하는 가장 좋은 방법은 클래스/함수를 작성하는 것입니다. 그런 다음 클래스/함수를 호출하십시오. 이 메서드를 사용하면 이벤트 루프 이 콜백을 처리 할 수 ​​있습니다. 아래의 코드 예제를 살펴보면 함수 이 만들어지고 콜백 함수로 사용됩니다. 이 (Agian)은 입니다. 이벤트 루프가 콜백을 비동기 적으로 수행 할 수 있습니다.

from tornado.httpclient import AsyncHTTPClient 

def asynchronous_fetch(url, callback): 
    http_client = AsyncHTTPClient() 
    def handle_response(response): 
     callback(response.body) 
    http_client.fetch(url, callback=handle_response) 
관련 문제