Repository navigation
Using Async Await? #61
Description
Activity
i actually started investigating it in a branch somewhere once but i didn't finish it.
the tricky bit is figuring out how far down the stack you are going to allow async/await to encroach. the pure domain code needs to be non-async, i would say. but what about the Repository and the UnitOfWork? Or the Service Layer? i didn't decide on a final answer for that...
Theoretically it should be possible based on my understanding, it looks like the repository, service layer handlers to the entry points will be async and external calls awaited. Will investigate this further and document my findings here.
Please see my refactoring: https://github.com/nomhoi/cosmicpython-fastapi
Reacted by Joaquim Alves Pinto and DelanThere are many examples with asynchronous FastAPI for RealWorld project:
https://github.com/search?q=realworld+fastapiPlease see my refactoring: https://github.com/nomhoi/cosmicpython-fastapi
Thanks for making efforts in this direction will definitely be on the look out to see how you implement this including the message_bus as async. Thank you for sharing.
Thanks for making efforts in this direction will definitely be on the look out to see how you implement this including the message_bus as async. Thank you for sharing.
I intend to complete all chapters.
All 13 chapters have been completed.
Reacted by Delan@nomhoi, tks for sharing this. While you are at it, it would be nice to consider issue #23
Is the problem in this test?
https://github.com/xtaje/code/blob/2f260cba7eae3c6467c14befddfa92cc6d003c52/tests/e2e/test_queue_race.pyI am not sure. If I understood it right the problem is when you have a server that don't spin up one thread per request. The reason been that the
busis a module variable and when in the same thread that would be a problem for the bus queue and the db session, since multiple requests would share the queue and session. In my case I am creating a new queue and uow on a per request basis, but I guess this is a problem for the tests on the project. I don't really know, because I am not running the projects code/tests.Please see my refactoring: https://github.com/nomhoi/cosmicpython-fastapi
this is awesome! well done :)
if i get a bit more time, i want to investigate some more patterns around this. can we make it so that the repository is non-async somehow?? if you could somehow pre-load the state before entering the service layer, and have the outputs be some combination of state to modify (on a sqla session maybe?) plus events, then maybe the whole service layer could be sync somehow? it wouldn't work for the UoW, but, idk, the dream is, the fewer unit tests use async, the better.
@hjwp why do you want a non-async? I am asking just because I am going full async on a project that I use the archit from your book.
two reasons at the top of my mind:
- async tests are slower (they tend to start and stop an event loop, makes them an order of magnitude slower in my experience)
- (i haven't really thought this through or experimented with it enough but) i see async as a sort of marker for "here be side effects + IO", so i thought of it as a really nice way of separating out a "functional core" from an "imperative shell", in the actual syntax of the language - a bit like the IO Monad in haskell. so in the python world, i'm thinking that the challenge is to keep as much of the core logic (and its unit tests) in a non-async world, and keep the async as close to the edges as possible. but that may not be compatible with repository pattern and unit of work.
Reacted by Sepideh Hosseinian- async tests are slower (they tend to start and stop an event loop, makes them an order of magnitude slower in my experience)
I used in conftest.py:
@pytest.fixture(scope="session") def event_loop(): policy = asyncio.get_event_loop_policy() loop = policy.new_event_loop() yield loop loop.close()
Only one event loop will be created per a testing session:
https://pytest-asyncio.readthedocs.io/en/latest/reference/fixtures.html#event-loop
By default the scope is 'function'.Reacted by Harry PercivalMay be this will be usefull: https://returns.readthedocs.io/en/latest/pages/future.html
Are derivatives/forks like the Fastapi one even legally allowed on github because the license is CC-By-ND?
for the record, it's fine by me. i'll see what i can do about the license...
Reacted by Delan, Daniel Baber and Joseph Sebastian
Is it possible to use async await, especially when accessing external resources like the db?