2016-06-23 4 views
-1

나는 미래를 돌려 보내는 기능이 있습니다. 미래에 완성 될 때까지 대기하는 함수에 데코레이터를 작성한 다음 비동기 함수를 blocking 함수로 변환하는 결과를 반환하고 싶습니다.이 함수는 내 REST API에서 사용할 것입니다. 그렇게 할 수있는 방법이 있습니까?토네이도 미래가 끝날 때까지 기다리십시오

+1

['run_sync'] (http://www.tornadoweb.org/en/stable/ioloop.html?highlight=run_sync#tornado.ioloop.IOLoop.run_sync)? – jonrsharpe

+0

더 나은 답변을 얻으려면 함수 코드를 게시하십시오. –

답변

0

미래를 해결하려면 yield해야합니다. 이런 식으로 뭔가를 작동 할 수 있습니다 :

from tornado import gen  

def blocking(func): 
    def new_func(*args, **kwargs): 
     result = yield func(*args, **kwargs) 
     return result 
    return gen.coroutine(new_func) 
+0

Python 버전 <3.3. 생성자 내부의 인수로 '반환'을 허용하지 않습니다. –

3
def sync(fn): 
    def wrapped(*args, **kwargs): 
     return IOLoop.instance().run_sync(lambda: fn(*args, **kwargs)) 

    return wrapped 

@gen.coroutine 
def my_coro(): 
    # ... 

sync_fn = sync(my_coro) 
result = sync_fn() 
+0

'fn' 자체가'@sync'로 꾸며진 다른 함수를 호출 할 때 오류가 발생합니다.'RuntimeError : Ioloop is already '해결 방법을 알려주시겠습니까? – freeza

+1

이 시점에서 나는 당신이 옳은 문제를 해결하고 있는지 심각하게 고려해야한다고 생각합니다. 코드를 비동기로 만들지 않으려면 왜 coroutines로 작성해야합니까? 비동기로 만들고 싶다면 왜이 데코레이터를 사용하고 싶습니까? –

+0

aync 라이브러리 (대안 없음)를 사용하고 있지만 내 코드를 REST API에 동기화하고 싶습니다. – freeza

관련 문제