Skip to main content

Typesafe parmap

pypi python Build Status

pip install typesafe-parmap

Run functions in parallel safely with your type checkers

Features

Easy run different functions in parallel

from typesafe_parmap import par_map_2
import time
from concurrent.futures import ThreadPoolExecutor

tp = ThreadPoolExecutor(5)

def long_running_int(param: int) -> int:
    time.sleep(5)  # long IO task here
    return 123

def long_running_str(param: str) -> str:
    time.sleep(5)  # long IO task here
    return "hello world"

int_result, str_result = par_map_2(
                        lambda: long_running_int(5),
                        lambda: long_running_str("test"),
                        executor=tp)
assert int_result == 123, str_result == "hello world"  # should finish in around 5 seconds

Function return types are inferred correctly by mypy / pycharm

reveal_type(int_result) # mypy infers int
reveal_type(str_result) # mypy infers str

Accidentally unpacked too many / little values? Type inference checks that for you!

one, two, three, four = par_map_3(
        lambda: long_running_int(5), lambda: long_running_str("test"), lambda: "something", executor=tp
    ) # Error: Need more than 3 values to unapck, (4 expected)

Got more than a few functions to run? We got you covered...

from typesafe_parmap import par_map_4 # ... all the way to par_map_22!

Want to change the number of functions to run in parallel? Hate having to import a different one each time? Use par_map_n!

from typesafe_parmap import par_map_2, par_map_3, par_map_n
a = par_map_2(lambda: long_running_int(5), lambda: long_running_str("test"), executor=executor)
b = par_map_n(lambda: long_running_int(5), lambda: long_running_str("test"), executor=executor)

assert a == b

c = par_map_3(
    lambda: long_running_int(5),
    lambda: long_running_str("test"),
    lambda: long_running_str("test"),
    executor=executor,
)
d = par_map_n(
    lambda: long_running_int(5),
    lambda: long_running_str("test"),
    lambda: long_running_str("test"),
    executor=executor,
)

assert c == d

Timeouts

Suppose you want to run a bunch of functions that might take a long time, but you don't want to wait forever. Use par_map_timeout_n!

from concurrent.futures import ThreadPoolExecutor
from datetime import timedelta
from typesafe_parmap import par_map_timeout_n
# Since there are 3 threads, we should be able to run 3 functions at once
executor = ThreadPoolExecutor(3)
int_result, str_result_1, str_result_2 = par_map_timeout_n(
    lambda: long_running_int(5),
    lambda: short_running_str("test 1"),
    lambda: short_running_str("test 2"),
    executor=executor,
    timeout=timedelta(seconds=5),
)
assert int_result is None # This function timed out
assert str_result_1 == "test 1" # This still finished in time
assert str_result_2 == "test 2" # This still finished in time

Note that as a result of the timeout, the return types of the int_result and str_result_1 are now Optional[str] and Optional[int] respectively.

Logging timeouts

par_map_timeout_n accepts a logger parameter. We also provide a class NamedThunk, which allows you to name your thunks so that the name is not just <lambda> in the logs.

from concurrent.futures import ThreadPoolExecutor
from datetime import timedelta
from typesafe_parmap import par_map_timeout_n, NamedThunk
executor = ThreadPoolExecutor(2)
par_map_timeout_n(
    NamedThunk(lambda: long_running_int(5), name="Long Running Int"),
    lambda: short_running_str("test 2"),
    executor=executor,
    timeout=timedelta(seconds=3),
    logger=print,
)
# Prints:
# par_map func1: Long Running Int timed out after 3 seconds

Metadata

Release files for typesafe-parmap 1.0.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for typesafe-parmap 1.0.7
File Size Uploaded Provenance
typesafe_parmap-1.0.7.tar.gz 13.5 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for typesafe-parmap 1.0.7
File Interpreter ABI Platform
typesafe_parmap-1.0.7-py3-none-any.whl Python 3 none any Details

Total release size: 24.7 kB

Release files / typesafe_parmap-1.0.7.tar.gz

Download URL typesafe_parmap-1.0.7.tar.gz
Size 13.5 kB
Tags Source
SHA-256 checksum
How to use checksums
ed0b887b4709676debbf35a7413c37d711187e21d094ccc437aff72aeda2b0ec
BLAKE2b-256 checksum
How to use checksums
56b0b6887d178406c11341253437444ddaf0e6e4c8c48c9e856103e6b5133831
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.11.1

Release files / typesafe_parmap-1.0.7-py3-none-any.whl

Download URL typesafe_parmap-1.0.7-py3-none-any.whl
Size 11.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4ea6bc53e2d37ad1d8e9880cbd4e53f49f1afc610fd398291840af73d831b9d0
BLAKE2b-256 checksum
How to use checksums
bebfe3e8ee75c754078ce1406a761e32b74d2ac63a16538dd323799189c1525b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.11.1

Security for typesafe-parmap 1.0.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page