Skip to content

Make Actor consistently reusable without raising ServiceConflictError #678

@vdusek

Description

@vdusek

Description

The following patterns should all be equivalent and valid:

1) Actor + Actor - works ✔️

async with Actor:
    Actor.exit_process = False
    print('Hello world')

async with Actor:
    print('Hello world')

2) Actor() + Actor - works ✔️

async with Actor(exit_process=False) as actor:
    print('Hello world')

async with Actor:
    print('Hello world')

3) Actor + Actor() - ServiceConflictError

async with Actor:
    Actor.exit_process = False
    print('Hello world')

async with Actor() as actor:
    print('Hello world')

4) Actor() + Actor() - ServiceConflictError

async with Actor(exit_process=False) as actor:
    print('Hello world')

async with Actor() as actor:
    print('Hello world')

We have real use cases for this (e.g., in the example-code-runner-py Actor).

However, some of these code paths currently raise a ServiceConflictError:

crawlee.errors.ServiceConflictError: Service EventManager is already in use. Existing value: <crawlee.events._local_event_manager.LocalEventManager object at 0x7f84b5460ad0>, attempted new value: <crawlee.events._local_event_manager.LocalEventManager object at 0x7f84b7483d90>.

This means the Actor context manager is not fully isolated between runs.

Possible solution

Apply the same service-locator cleanup/isolation logic that we already use in conftest.py:

# Reset the services in the service locator.
service_locator._configuration = None
service_locator._event_manager = None
service_locator._storage_client = None
service_locator.storage_instance_manager.clear_cache()

This should allow all async with Actor usages to behave consistently and avoid cross-run conflicts.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working.t-toolingIssues with this label are in the ownership of the tooling team.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions