Skip to content

Using Provider.disable_async_mode() #802

Open
@misuzu

Description

@misuzu

I need to be able to get a service in a sync function. I've tried

import asyncio

from dependency_injector import containers, providers


async def init_async_resource():
    await asyncio.sleep(0.1)
    yield "Initialized"


class Service:
    def __init__(self, resource):
        self.resource = resource


class Container(containers.DeclarativeContainer):

    resource = providers.Resource(init_async_resource)

    service = providers.Factory(
        Service,
        resource=resource,
    )


async def main(container: Container):
    container = Container()
    await container.init_resources()

    container.service.disable_async_mode()
    service = container.service()
    assert isinstance(service, Service)

    await container.shutdown_resources()


if __name__ == "__main__":
    container = Container()

    asyncio.run(main(container))

While this works, I don't want to do this everywhere:

    container.service.disable_async_mode()
    service = container.service()

I've tried to call disable_async_mode in init_resources, but it doesn't work:

import asyncio

from dependency_injector import containers, providers


async def init_async_resource():
    await asyncio.sleep(0.1)
    yield "Initialized"


class Service:
    def __init__(self, resource):
        self.resource = resource


class Container(containers.DeclarativeContainer):

    resource = providers.Resource(init_async_resource)

    service = providers.Factory(
        Service,
        resource=resource,
    )

    async def init_resources(self, *args, **kwargs):
        await super().init_resources(*args, **kwargs)
        self.service.disable_async_mode()


async def main(container: Container):
    container = Container()
    await container.init_resources()

    service = container.service()
    assert isinstance(service, Service)

    await container.shutdown_resources()


if __name__ == "__main__":
    container = Container()

    asyncio.run(main(container))
$ python test.py
Traceback (most recent call last):
  File "test.py", line 43, in <module>
    asyncio.run(main(container))
  File "/usr/local/lib/python3.9/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 647, in run_until_complete
    return future.result()
  File "test.py", line 35, in main
    assert isinstance(service, Service)
AssertionError

So where do I need to call disable_async_mode for it to work as I need?

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