Skip to main content

Higher level threading with futures

Project description

threadlet

PyPI - Version PyPI - Python Version

from threadlet import spawn, go


def plus2(n):
  return n + 2


future = spawn(plus2, 1)  # run in thread
assert future.result() == 3

future = go(plus2, 2)  # run in adaptive thread pool executor
assert future.result() == 4
  • spawn is a helper which runs your function in a separate thread and returns Future.
  • go is a similar helper, but runs task in adaptive thread pool executor.
  • Task is an object for encapsulating some function, its arguments and Future to storing its result.
  • Worker is a thread with a loop for executing incoming tasks.
  • SimpleThreadPoolExecutor is a simple variant of concurrent.futures.ThreadPoolExecutor which spawns all the threads at the beginning.
  • ThreadPoolExecutor is an adaptive variant of the concurrent.futures.ThreadPoolExecutor which automatically spawns and shutdowns threads depending on load.

Table of Contents

Installation

pip install threadlet

Usage

import threading
from threadlet import (
    spawn,
    go,
    Future,
    Task,
    Worker,
    SimpleThreadPoolExecutor,
    ThreadPoolExecutor,
)


def calc(x):
    return x * 2


# execute function in an adaptive thread pool executor
# which is going to be started automatically at first `go` call and shut down at application exit
future = go(calc, 2)
assert future.result() == 4
# is equivalent to:
with ThreadPoolExecutor() as tpe:
    future = tpe.submit(calc, 2)
    assert future.result() == 4

# execute function in a separate thread:
future = spawn(calc, 2)
assert future.result() == 4
# is equivalent to:
task = Task(Future(), calc, [2], {})
threading.Thread(target=task.run).start()
assert task.future.result() == 4

# spawns one thread(worker) to sequentially handle all submitted functions
with Worker() as w:
    f1 = w.submit(calc, 3)
    f2 = w.submit(calc, 4)
    assert f1.result() == 6
    assert f2.result() == 8

# spawns 4 threads(workers) to handle all tasks in parallel
with SimpleThreadPoolExecutor(4) as tpe:
    future = tpe.submit(calc, 5)
    assert future.result() == 10

Benchmarks

  • submit: submits 1 million futures.
  • e2e[N] (end to end[N workers]): submits 1 million futures using N workers and consumes results in a separate thread.
concurrent.futures.thread.ThreadPoolExecutor submit: time=12.94s size=0.04mb, peak=43.61mb
                threadlet.ThreadPoolExecutor submit: time= 2.89s size=0.04mb, peak=20.35mb
          threadlet.SimpleThreadPoolExecutor submit: time= 2.72s size=0.04mb, peak=24.49mb

concurrent.futures.thread.ThreadPoolExecutor e2e[1]: time=15.80s size=0.04mb, peak=28.56mb
                threadlet.ThreadPoolExecutor e2e[1]: time= 4.32s size=0.02mb, peak=19.48mb
          threadlet.SimpleThreadPoolExecutor e2e[1]: time= 4.23s size=0.02mb, peak=26.45mb

concurrent.futures.thread.ThreadPoolExecutor e2e[2]: time=33.36s size=0.07mb, peak=32.00mb
                threadlet.ThreadPoolExecutor e2e[2]: time= 4.35s size=0.02mb, peak=35.83mb
          threadlet.SimpleThreadPoolExecutor e2e[2]: time= 4.18s size=0.02mb, peak=41.81mb

concurrent.futures.thread.ThreadPoolExecutor e2e[4]: time= 7.49s size=0.11mb, peak=42.97mb
                threadlet.ThreadPoolExecutor e2e[4]: time= 4.37s size=0.03mb, peak=28.21mb
          threadlet.SimpleThreadPoolExecutor e2e[4]: time= 4.30s size=0.02mb, peak=39.81mb

concurrent.futures.thread.ThreadPoolExecutor e2e[8]: time= 7.30s size=0.21mb, peak=41.04mb
                threadlet.ThreadPoolExecutor e2e[8]: time= 4.49s size=0.05mb, peak=29.20mb
          threadlet.SimpleThreadPoolExecutor e2e[8]: time= 4.18s size=0.03mb, peak=38.36mb

License

threadlet is distributed under the terms of the MIT license.

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

threadlet-3.1.0.tar.gz (8.5 kB view details)

Uploaded Source

Built Distribution

threadlet-3.1.0-py3-none-any.whl (5.5 kB view details)

Uploaded Python 3

File details

Details for the file threadlet-3.1.0.tar.gz.

File metadata

  • Download URL: threadlet-3.1.0.tar.gz
  • Upload date:
  • Size: 8.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.11.7

File hashes

Hashes for threadlet-3.1.0.tar.gz
Algorithm Hash digest
SHA256 b8111aec29584ec151bf0c207502c8678633b2dfcce10be491b30b45132673ee
MD5 3beac73751f4b8108936142a9af7f773
BLAKE2b-256 2bcb032b51938bc0d2c009c4b7254a87ffae2bf74a7983a938f4087de798cb7d

See more details on using hashes here.

File details

Details for the file threadlet-3.1.0-py3-none-any.whl.

File metadata

  • Download URL: threadlet-3.1.0-py3-none-any.whl
  • Upload date:
  • Size: 5.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.11.7

File hashes

Hashes for threadlet-3.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 973f9d5de2462edf8910f579e4a423b71ae5ec85c584410783708b4fdb03b7f9
MD5 5dada99799062a9c2b6e208841d571b4
BLAKE2b-256 785a96ad5003c52384d0fdcf5b303ad3c8e4905b7a3c4ef1b9dec4523fc4f3b5

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