Dynamically manage pools of asyncio tasks
Go to file
2022-02-04 17:41:10 +01:00
requirements Initial commit 2022-02-03 20:06:30 +01:00
src/asyncio_taskpool refactoring, additional command, improvements 2022-02-04 17:41:10 +01:00
tests Initial commit 2022-02-03 20:06:30 +01:00
usage client cli and usage example 2022-02-04 16:25:44 +01:00
.coveragerc Initial commit 2022-02-03 20:06:30 +01:00
.gitignore Initial commit 2022-02-03 20:06:30 +01:00
coverage.sh Initial commit 2022-02-03 20:06:30 +01:00
pyproject.toml Initial commit 2022-02-03 20:06:30 +01:00
README.md first working draft 2022-02-04 11:07:02 +01:00
setup.cfg meta adjustments 2022-02-03 20:10:26 +01:00

asyncio-taskpool

Dynamically manage pools of asyncio tasks

Usage

Demo:

import logging
import asyncio

from asyncio_taskpool.pool import TaskPool


logging.getLogger().setLevel(logging.NOTSET)
logging.getLogger('asyncio_taskpool').addHandler(logging.StreamHandler())


async def work(n):
    for i in range(n):
        await asyncio.sleep(1)
        print("did", i)


async def main():
    pool = TaskPool(work, (5,))  # initializes the pool
    pool.start(3)  # launches work tasks 0, 1, and 2
    await asyncio.sleep(1.5)
    pool.start()  # launches work task 3
    await asyncio.sleep(1.5)
    pool.stop(2)  # cancels tasks 3 and 2
    await pool.gather()  # awaits all tasks, then flushes the pool


if __name__ == '__main__':
    asyncio.run(main())

Output:

Started work_pool_task_0
Started work_pool_task_1
Started work_pool_task_2
did 0
did 0
did 0
Started work_pool_task_3
did 1
did 1
did 1
did 0
did 2
did 2
Cancelling work_pool_task_2 ...
Cancelled work_pool_task_2
Exiting work_pool_task_2
Cancelling work_pool_task_3 ...
Cancelled work_pool_task_3
Exiting work_pool_task_3
did 3
did 3
Exiting work_pool_task_0
Exiting work_pool_task_1
did 4
did 4

Installation

pip install asyncio-taskpool

Dependencies

Python Version 3.8+, tested on Linux

Building from source

Run python -m build