Friday, 9 November 2018

Mixing tornado and sqlalchemy

I'm trying to write a tornado web application that uses sqlalchemy in some request handlers. These handlers have two parts: one that takes a long time to complete, and another that uses sqlalchemy and is relatively fast. I would like to make the slow part of the request asynchronous, but not the sqlalchemy part. Can I do something like the following code and be safe?

class ExampleHandler(BaseHandler):
    async def post(self):
        loop = asyncio.get_event_loop()
        await loop.run_in_executor(...)   # very slow (no sqlalchemy here)

        with self.db_session() as s:      # sqlalchemy session
            s.add(...)
            s.commit()

        self.render(...)

The idea is to have sqlalchemy still blocking, but have the computational heavy part not blocking the application.



from Mixing tornado and sqlalchemy

No comments:

Post a Comment