Skip to main content

Makes your blocking functions awaitable. This package has been renamed to: awaiter.

Project description

asyncutor

This package has been renamed to: awaiter.

codecov Quality Gate Status

Makes your blocking functions awaitable.

awaiter.ThreadExecutor() represents a single thread that you can use to execute blocking functions in a FIFO manner. It does not use a thread pool like asyncio.to_thread() or loop.run_in_executor(), to keep it minimal and predictable.

Usage

import asyncio
import time

from awaiter import ThreadExecutor


def blocking_function(name):
    time.sleep(1)
    return f'Hello, {name}!'

async def main():
    async with ThreadExecutor() as executor:
        result = await executor(blocking_function)('World')
        print(result)

    # out of context, the thread is closed here

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

Or use the decorator style:

import asyncio
import time

from awaiter import ThreadExecutor

executor = ThreadExecutor()


@executor
def blocking_function(name):
    time.sleep(1)
    return f'Hello, {name}!'

async def main():
    executor.start()

    result = await blocking_function('World')
    print(result)

    executor.shutdown()
    # the thread will be closed.
    # if you want to wait until all queued tasks are completed:
    # await executor.shutdown()

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

If you want to execute multiple tasks at once without waiting in the main thread, use executor.submit():

# ...

    fut1 = executor.submit(blocking_function, 'World')
    fut2 = executor.submit(blocking_function, 'Foo')
    fut3 = executor.submit(blocking_function, 'Bar')

# ...

Last but not least, it also supports generator functions:

# ...

@executor
def generator_function(name):
    yield 'Hello, '
    time.sleep(1)
    yield name
    yield '!'

# ...

    async for data in generator_function('World'):
        print(data)

# ...

But I want a thread pool?

We provide the awaiter.MultiThreadExecutor helper.

It has a thread pool-like approach and is more suitable for use as a single, persistent object:

executor = MultiThreadExecutor(size=10)

How to use is the same, as the interface is identical to awaiter.ThreadExecutor.

Install

python3 -m pip install --upgrade awaiter

License

MIT

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

asyncutor-0.1.1.tar.gz (3.2 kB view details)

Uploaded Source

Built Distribution

asyncutor-0.1.1-py3-none-any.whl (3.4 kB view details)

Uploaded Python 3

File details

Details for the file asyncutor-0.1.1.tar.gz.

File metadata

  • Download URL: asyncutor-0.1.1.tar.gz
  • Upload date:
  • Size: 3.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.9

File hashes

Hashes for asyncutor-0.1.1.tar.gz
Algorithm Hash digest
SHA256 4c76df91c27d3c0e838c266dbce7e3fccaf561064a8e71b0090dc47c8aa9fa18
MD5 de27f2c51315a86e6b1d0c9b5d739257
BLAKE2b-256 b7b05d3638a2a04d40c52964d3d993706b7d0ff9cf6b1e015bdced2fc8de9680

See more details on using hashes here.

File details

Details for the file asyncutor-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: asyncutor-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 3.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.9

File hashes

Hashes for asyncutor-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 797ec3403f0a96909044dec899c062c12d6b62f420300cbb2288a9201552974f
MD5 b352a7154fa167ec368a2c897066b976
BLAKE2b-256 26bfe99ad25d629a3d8f50a3a6ac2f3d2200ecc3bc84dbea67e19dbc0f3558d4

See more details on using hashes here.

Supported by

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