Skip to main content

Tools to run asyncio tasks concurrently.

Project description

asyncio-concurrent-tasks

tests version python

Tooling to run asyncio tasks.

Background task

Task that is running in the background until cancelled. Can be used as a context manager.

Example usage:

import asyncio
from typing import Callable, Awaitable
from concurrent_tasks import BackgroundTask


class HeartBeat(BackgroundTask):
    def __init__(self, interval: float, func: Callable[[], None]):
        super().__init__(self._run, interval, func)

    async def _run(self, interval: float, func: Callable[[], Awaitable]) -> None:
        while True:
            await func()
            await asyncio.sleep(interval)

Thread safe task pool

The goal is to be able to safely run tasks from other threads.

Parameters:

  • size can be a positive integer to limit the number of tasks concurrently running.
  • timeout can be set to define a maximum running time for each time after which it will be cancelled. Note: this excludes time spent waiting to be started (time spent in the buffer).

Example usage:

from concurrent_tasks import ThreadSafeTaskPool


async def func():
    ...


async with ThreadSafeTaskPool() as pool:
    # Create and run the task.
    result = await pool.run(func())
    # Create a task, the `concurrent.Future` will hold information about completion.
    future = pool.create_task(func())

Threaded task pool

Run async tasks in a dedicated thread. It will have its own event loop. Under the hook, ThreadSafeTaskPool is used.

Parameters:

  • name will be used as the thread's name.
  • size and timeout see ThreadSafeTaskPool.
  • context_manager can be optional context managers that will be entered when the loop has started and exited before the loop is stopped.

💡 All tasks will be completed when the pool is stopped.

💡 Blocking and async version are the same, prefer the async version if client code is async.

Loop initialization

⚠️ Asyncio primitives need to be instantiated with the proper event loop.

To achieve that, use a context manager wrapping instantiation of objects:

from functools import partial

from concurrent_tasks import ThreadedPoolContextManagerWrapper, AsyncThreadedTaskPool

pool = AsyncThreadedTaskPool(context_manager=ThreadedPoolContextManagerWrapper(partial(MyObj, ...)))

Blocking

This can be used to run async functions in a dedicated event loop, while keeping it running to handle background tasks

Example usage:

from concurrent_tasks import BlockingThreadedTaskPool


async def func():
    ...


with BlockingThreadedTaskPool() as pool:
    # Create and run the task.
    result = pool.run(func())
    # Create a task, the `concurrent.Future` will hold information about completion.
    future = pool.create_task(func())

Async

Threads can be useful in cooperation with asyncio to let the OS guarantee fair resource distribution between threads. This is especially useful in case you cannot know if called code will properly cooperate with the event loop.

Example usage:

from concurrent_tasks import AsyncThreadedTaskPool


async def func():
    ...


async with AsyncThreadedTaskPool() as pool:
    # Create and run the task.
    result = await pool.run(func())
    # Create a task, the asyncio.Future will hold information about completion.
    future = pool.create_task(func())

Restartable task

Task that can be started and cancelled multiple times until it can finally be completed. This is useful to handle pauses and retries when handling with a connection.

💡 Use functools.partial to pass parameters to the function.

Example usage:

from functools import partial
from concurrent_tasks import RestartableTask

async def send(data): ...

task: RestartableTask[int] = RestartableTask(partial(send, b"\x00"), timeout=1)
task.start()
assert await task == 1

# Running in other tasks:

# On connection lost:
task.cancel()
# On connection resumed:
task.start()
# On response received:
task.set_result(1)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

concurrent_tasks-1.4.1.tar.gz (8.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

concurrent_tasks-1.4.1-py3-none-any.whl (10.7 kB view details)

Uploaded Python 3

File details

Details for the file concurrent_tasks-1.4.1.tar.gz.

File metadata

  • Download URL: concurrent_tasks-1.4.1.tar.gz
  • Upload date:
  • Size: 8.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.4.0 CPython/3.11.2 Linux/5.15.0-1034-azure

File hashes

Hashes for concurrent_tasks-1.4.1.tar.gz
Algorithm Hash digest
SHA256 f8a3608fbe714727d8f7fc694bea405494e29ea589acc3815496283666ac0553
MD5 053bd758ca0c25ce94987b0195aa90f6
BLAKE2b-256 4547f15b14b7bd7f75ec9bd01f7a2448f86381d1c2690ebe540d7e40076fba92

See more details on using hashes here.

File details

Details for the file concurrent_tasks-1.4.1-py3-none-any.whl.

File metadata

  • Download URL: concurrent_tasks-1.4.1-py3-none-any.whl
  • Upload date:
  • Size: 10.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.4.0 CPython/3.11.2 Linux/5.15.0-1034-azure

File hashes

Hashes for concurrent_tasks-1.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 8ab20656c86ddedb225f1db52a1063193a3117b6589e88eb5b2a9eab2a23e3eb
MD5 551afb5c7a4463cb65e3514c2c33a76b
BLAKE2b-256 447edd0efe16bd22412402c8370f2dfed25acb4261d17994b7f19990a1094e41

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page