2016-04-29 1 views
1

Я хотел бы запустить метод с run_sync для запуска торнадо IOLoop, который запускает асинхронные методы.Как использовать run_sync для торнадо Python при создании подпрограмм async?

Вот идея:

@gen.coroutine 
def async(string): 
    print string 


@gen.coroutine 
def sync(): 
    string_list = yield async_call() 
    for string in string_list: 
     async(string=string) 

loop = IOLoop.current() 
loop.run_sync(lambda: sync) 

Так что, все в синхронизации должен происходить синхронно, но порядок, в котором асинхронный называются не имеет значения. Это возможно с торнадо?

ответ

0

Как я вижу, вы неправильно поняли смысл асинхронных вычислений. В двух словах, если у вас есть две функции, которые вы выполняете асинхронно в IOLoop, код каждой функции будет выполняться одновременно, но рабочий процесс функции будет по-прежнему синхронным.

При запуске async метод без yield ключевого слова вы должны быть уверены, что она заканчивается перед функцией вызывающей, особенно при использовании run_sync который останавливает IOLoop после функции остановилась. Это может привести к неопределенному поведению, когда async все еще работает, но IOLoop остановлен.

Я редактировал свой код, чтобы показать, что функция рабочего процесса sync «s выполняется синхронно:

@gen.coroutine 
def async(string): 
    yield gen.sleep(2) 
    print string 

@gen.coroutine 
def async_call(): 
    return ["one", "two", "three"] 

@coroutine 
def sync(): 
    string_list = yield async_call() 
    for string in string_list: 
     yield async(string) 

loop = IOLoop.current() 
loop.run_sync(sync) 

Выход:

$python test_async.py 
one 
two 
three 
+0

почти, вызывая асинхр на самом деле планировать и выполнять эту функцию, если ioloop будет остановлен. Функции Async требуют, чтобы ioloop запускался, уступал или нет. С 'yield' он ждет, пока асинхронное завершение. – kwarunek

+0

@kwarunek Спасибо, что упомянули, я проверил это на своей машине и, похоже, работает, как вы говорите. Но для меня все еще не ясно: в случае, когда для метода async требуется больше времени, чем 'sync', IOLoop будет остановлен до того, как он закончится, и я действительно не представляю, будет ли' async' закончен правильно или нет. – pupizoid