generated from daniil-berg/boilerplate-py
83 lines
2.1 KiB
Markdown
83 lines
2.1 KiB
Markdown
# Using `asyncio-taskpool`
|
|
|
|
## Minimal example for `SimpleTaskPool`
|
|
|
|
The minimum required setup is a "worker" coroutine function that can do something asynchronously, a main coroutine function that sets up the `SimpleTaskPool` and starts/stops the tasks as desired, eventually awaiting them all.
|
|
|
|
The following demo code enables full log output first for additional clarity. It is complete and should work as is.
|
|
|
|
### Code
|
|
```python
|
|
import logging
|
|
import asyncio
|
|
|
|
from asyncio_taskpool.pool import SimpleTaskPool
|
|
|
|
|
|
logging.getLogger().setLevel(logging.NOTSET)
|
|
logging.getLogger('asyncio_taskpool').addHandler(logging.StreamHandler())
|
|
|
|
|
|
async def work(n: int) -> None:
|
|
"""
|
|
Pseudo-worker function.
|
|
Counts up to an integer with a second of sleep before each iteration.
|
|
In a real-world use case, a worker function should probably have access
|
|
to some synchronisation primitive or shared resource to distribute work
|
|
between an arbitrary number of workers.
|
|
"""
|
|
for i in range(n):
|
|
await asyncio.sleep(1)
|
|
print("did", i)
|
|
|
|
|
|
async def main() -> None:
|
|
pool = SimpleTaskPool(work, (5,)) # initializes the pool; no work is being done yet
|
|
await pool.start(3) # launches work tasks 0, 1, and 2
|
|
await asyncio.sleep(1.5) # lets the tasks work for a bit
|
|
await pool.start() # launches work task 3
|
|
await asyncio.sleep(1.5) # lets the tasks work for a bit
|
|
pool.stop(2) # cancels tasks 3 and 2
|
|
pool.close() # required for the last line
|
|
await pool.gather() # awaits all tasks, then flushes the pool
|
|
|
|
|
|
if __name__ == '__main__':
|
|
asyncio.run(main())
|
|
```
|
|
|
|
### Output
|
|
```
|
|
SimpleTaskPool-0 initialized
|
|
Started SimpleTaskPool-0_Task-0
|
|
Started SimpleTaskPool-0_Task-1
|
|
Started SimpleTaskPool-0_Task-2
|
|
did 0
|
|
did 0
|
|
did 0
|
|
Started SimpleTaskPool-0_Task-3
|
|
did 1
|
|
did 1
|
|
did 1
|
|
did 0
|
|
SimpleTaskPool-0 is closed!
|
|
Cancelling SimpleTaskPool-0_Task-3 ...
|
|
Cancelled SimpleTaskPool-0_Task-3
|
|
Ended SimpleTaskPool-0_Task-3
|
|
Cancelling SimpleTaskPool-0_Task-2 ...
|
|
Cancelled SimpleTaskPool-0_Task-2
|
|
Ended SimpleTaskPool-0_Task-2
|
|
did 2
|
|
did 2
|
|
did 3
|
|
did 3
|
|
Ended SimpleTaskPool-0_Task-0
|
|
Ended SimpleTaskPool-0_Task-1
|
|
did 4
|
|
did 4
|
|
```
|
|
|
|
## Advanced example
|
|
|
|
...
|