Cannot get actors to work with async / await
- Dominant language
- Python
- Stars
- 1.7k
- Forks
- 778
- Avg merge
- 2h 50m
- Merged PRs (30d)
- 3
Description
I have been searching for an actor framework in Python with good asyncio integration and appear to have found it!! However, running the examples from [the docs on using actors with async/await](https://distributed.dask.org/en/latest/actors.html#calling-from-coroutines-and-async-await) yields an error. The complete code I am trying to run (copied from the examples) follows:
```python
import asyncio
from dask.distributed import Client
class Counter:
""" A simple class to manage an incrementing counter """
n = 0
def __init__(self):
self.n = 0
def increment(self):
self.n += 1
return self.n
def add(self, x):
self.n += x
return self.n
async def test_async(client: Client) -> None:
counter = await client.submit(Counter, actor=True)
await counter.increment()
n = await counter.n
print(f'n = {n}')
if __name__ == '__main__':
client = Client()
asyncio.run(test_async(client))
```
Here is the full text of the error:
```
Traceback (most recent call last):
File "D:\Users\charl\Documents\2_dask\dask_test.py", line 30, in
asyncio.run(test_async(client))
File "C:\Users\charl\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 194, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "C:\Users\charl\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\charl\AppData\Local\Programs\Python\Python312\Lib\asyncio\base_events.py", line 684, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "D:\Users\charl\Documents\2_dask\dask_test.py", line 21, in test_async
counter = await client.submit(Counter, actor=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Users\charl\Documents\2_dask\.venv\Lib\site-packages\distributed\client.py", line 620, in __await__
return self.result().__await__()
^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Users\charl\Documents\2_dask\.venv\Lib\site-packages\distributed\actor.py", line 165, in __getattr__
attr = getattr(self._cls, key)
^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: type object 'Counter' has no attribute '__await__'. Did you mean: '__init__'?
2024-11-16 13:03:27,968 - distributed.scheduler - WARNING - Removing worker 'tcp://127.0.0.1:62438' caused the cluster to lose already computed task(s), which will be recomputed elsewhere: {'Counter-23599479-2f43-4126-92ac-58b1f172a47e'} (stimulus_id='handle-worker-cleanup-1731783807.9682791')
```
Also as a side note, this text from the [example using async in an actor function](https://distributed.dask.org/en/latest/actors.html#coroutines-and-async-await-on-the-actor) appears to have a typo (should be `class Waiter` not `def Waiter`)
Contributor guide
Assessment
This issue has not been assessed yet.