Execute function wrapped by tornado.gen.coroutine synchronously
It turned out a simple task, just use IOLoop.run_sync:
import datetime
import logging
from tornado import ioloop, gen, options
logger = logging.getLogger(__name__)
@gen.coroutine
def sleep(seconds=2):
logger.warning('start')
yield gen.Task(
ioloop.IOLoop.current().add_timeout,
deadline=datetime.timedelta(seconds=seconds))
logger.warning('stop')
if __name__ == "__main__":
options.parse_command_line()
ioloop.IOLoop.instance().run_sync(sleep, timeout=1000)
UPD 2014-12-27
It turned out, that run_sync doesn't work in celery tasks if Kqueue used(didn't tested it with epoll), simple workaround - just use Select instead:
from tornado.platform.select import SelectIOLoop
@celery.task()
def my_task():
ioloop_inst = SelectIOLoop.instance()
ioloop_inst.initialize()
ioloop_inst.run_sync(sleep, timeout=1000)
Licensed under CC BY-SA 3.0