Skip to content

Using Async Await? #61

Description

@Didza

Is it possible to use async await, especially when accessing external resources like the db?

Activity

  1. hjwp commented on Mar 20, 2023

    @hjwp
    Contributor

    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...

  2. Didza commented on Mar 20, 2023

    @Didza
    Author

    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.

  3. nomhoi commented on Mar 30, 2023

    @nomhoi
  4. nomhoi commented on Mar 30, 2023

    @nomhoi

    There are many examples with asynchronous FastAPI for RealWorld project:
    https://github.com/search?q=realworld+fastapi

  5. Didza commented on Mar 30, 2023

    @Didza
    Author

    Please 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.

  6. nomhoi commented on Mar 31, 2023

    @nomhoi

    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.

  7. jalvespinto commented on Apr 4, 2023

    @jalvespinto

    @nomhoi, tks for sharing this. While you are at it, it would be nice to consider issue #23

  8. nomhoi commented on Apr 5, 2023

    @nomhoi

    @nomhoi, tks for sharing this. While you are at it, it would be nice to consider issue #23

    Ok, a bit later.

  9. nomhoi commented on Apr 11, 2023

    @nomhoi

    All 13 chapters have been completed.

  10. nomhoi commented on Apr 11, 2023

    @nomhoi

    @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.py

  11. jalvespinto commented on Apr 15, 2023

    @jalvespinto

    I 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 bus is 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.

  12. hjwp commented on Apr 26, 2023

    @hjwp
    Contributor

    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.

  13. jalvespinto commented on Apr 26, 2023

    @jalvespinto

    @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.

  14. hjwp commented on Apr 27, 2023

    @hjwp
    Contributor

    two reasons at the top of my mind:

    1. async tests are slower (they tend to start and stop an event loop, makes them an order of magnitude slower in my experience)
    2. (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.
  15. nomhoi commented on May 16, 2023

    @nomhoi
    1. 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'.

  16. nomhoi commented on May 16, 2023

    @nomhoi
  17. dbaber commented on Sep 7, 2023

    @dbaber

    Are derivatives/forks like the Fastapi one even legally allowed on github because the license is CC-By-ND?

  18. hjwp commented on Sep 25, 2023

    @hjwp
    Contributor

    for the record, it's fine by me. i'll see what i can do about the license...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions