Higher level threading with futures
Project description
threadlet
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
Release history Release notifications | RSS feed
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)
Built Distribution
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | b8111aec29584ec151bf0c207502c8678633b2dfcce10be491b30b45132673ee |
|
MD5 | 3beac73751f4b8108936142a9af7f773 |
|
BLAKE2b-256 | 2bcb032b51938bc0d2c009c4b7254a87ffae2bf74a7983a938f4087de798cb7d |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 973f9d5de2462edf8910f579e4a423b71ae5ec85c584410783708b4fdb03b7f9 |
|
MD5 | 5dada99799062a9c2b6e208841d571b4 |
|
BLAKE2b-256 | 785a96ad5003c52384d0fdcf5b303ad3c8e4905b7a3c4ef1b9dec4523fc4f3b5 |