Skip to main content

bocpy is a Python extension that adds Behavior-oriented concurrency built on top of cross-interpreter data.

Project description

bocpy

BOC Logo

Behavior-Oriented Concurrency (BOC) is a new paradigm for parallel and concurrent programming which is particularly well-suited to Python. In a BOC program, data is shared such that each behavior has unique temporal ownership of the data, removing the need for locks to coordinate access. For Python programmers, this brings a lot of benefits. Behaviors are implemented as decorated functions, and from the programmer's perspective, those functions work like normal. Importantly, the programmer's task shifts from solving concurrent data access problems to organizing data flow through functions. The resulting programs are easier to understand, easier to support, easier to extend, and unlock multi-core performance due to the ability to schedule behaviors to run efficiently across multiple sub-interpreters.

BOC has been implemented in several languages, including as a foundational aspect of the research language Verona, and now has been implemented in Python.

Getting Started

You can install bocpy via PyPi:

pip install bocpy

We provide pre-compiled wheels for Python 3.10 onwards on most platforms, but if you have problems with your particular platform/version combination, please file an issue on this repository.

[!NOTE] We provide wheels for Python 3.10 and newer, but bocpy only achieves true parallelism on Python 3.12+, where each sub-interpreter has its own GIL. On 3.10 and 3.11 behaviors still run, but they are serialised by the global GIL. The library may not work on Python versions older than 3.10.

Python version support

The mainline (main) branch in the diagram is the standard CPython build:

  • 3.10 / 3.11 — wheels are published and @when works, but every sub-interpreter still shares one process-wide GIL, so behaviors execute one at a time. Use these versions for portability rather than performance.
  • 3.12+ — each sub-interpreter gets its own GIL (PEP 684), so worker behaviors run in parallel across cores. This is where bocpy delivers on its concurrency story.
  • 3.14 is the current default development and CI target; 3.15 is validated as it stabilises.

The free-threaded branch tracks the no-GIL CPython builds (informally "3.13t", "3.14t", "3.15t" — see PEP 703). bocpy runs unmodified on these interpreters today: we don't re-enable the GIL, and the cown / 2PL protocol gives the same data-race-free guarantees you get on the GIL build. The catch is overhead — on free-threaded Python, the sub-interpreter and XIData machinery is pure ceremony, since plain threads in the main interpreter would already run in parallel.

Issue #5 tracks adding an alternative direct-threading backend that detects a free-threaded interpreter at runtime and skips the sub-interpreter / transpiler / XIData path entirely, while keeping the public Cown / @when API unchanged. We're holding off on that work until the free-threaded build and the relevant CPython APIs stabilise.

Scaling with cores

The chart below shows BOC runtime throughput as the worker count grows from 1 to 8, plotted as speedup relative to a single worker. Numbers come from examples/benchmark.py — a chain-ring workload that exercises the scheduler, two-phase locking, sub-interpreter crossings and the message queue together — run on CPython 3.14 (mean of 3 repeats, 8 s each).

The line is the ideal y = x reference; the bars are measured speedup. Up to 8 workers, BOC delivers roughly linear scaling on this microbenchmark (≈7.5× at 8 workers). Real applications carry serial costs that this benchmark deliberately strips out — see the docstring at the top of examples/benchmark.py for the load-bearing caveats. To reproduce:

python examples/benchmark.py \
    --sweep-axis workers --sweep-values 1,2,3,4,5,6,7,8 \
    --duration 8 --warmup 2 --repeats 3 \
    --output scaling.json

A behavior can be thought of as a function which depends on zero or more concurrently-owned data objects (which we call cowns). As a programmer, you indicate that you want the function to be called once all of those resources are available. For example, let's say that you had two complex and time-consuming operations, and you needed to act on the basis of both of their outcomes:

def buy_cheese():
    logger = logging.getLogger("cheese_shop")
    for name in all_known_cheeses():
        if is_available(logger, name):
            return name
    
    cleanup_shop(logger)
    return None


def order_meal(exclude: str):
    logger = logging.getLogger("greasy_spoon")
    for dish in menu():
        logger.info(dish)
        if exclude.lower() not in dish.lower():
            logger.info(f"That doesn't have much {exclude} in it")
            return dish

        vikings(logger)
        if random.random() < 0.3:
            logger.info("<bloody vikings>")

    return None


cheese = buy_cheese()
meal = order_meal(exclude="spam")

if meal is not None:
    eat(meal)
elif cheese is not None:
    eat(cheese)

if meal is not None:
    print("I really wanted some cheese...")
elif cheese is not None:
    print("Cheesy comestibles")

return_to_library()

The code above will work, but requires the purveying of cheese and the navigation of the menu for non-spam options to happen sequentially. If we wanted to do these tasks in parallel, we will end up with some version of nested waiting, which can result in deadlock. With BOC, we would write the above like this:

from bocpy import wait, when, Cown

# ...

def buy_cheese():
    cheese = Cown(None)

    @when(cheese)
    def _(cheese):
        logger = logging.getLogger("cheese_shop")
        for name in all_known_cheeses():
            if is_available(logger, name):
                cheese.value = name
                return

        cleanup_shop(logger)

    return cheese


def order_meal(exclude: str):
    order = Cown(None)

    @when(order)
    def _(order):
        logger = logging.getLogger("greasy_spoon")
        logger.info("We have...")
        for dish in menu():
            logger.info(dish)
            if exclude.lower() not in dish.lower():
                logger.info(f"That doesn't have much {exclude} in it")
                order.value = dish
                return

            vikings(logger)
            if random.random() < 0.3:
                logger.info("<bloody vikings>")

    return order


cheese = buy_cheese()
meal = order_meal(exclude="spam")


@when(cheese, meal)
def _(cheese, meal):
    if meal.value is not None:
        eat(meal.value)
    elif cheese.value is not None:
        eat(cheese.value)
    else:
        print("<stomach rumbles>")


@when(cheese, meal)
def _(cheese, meal):
    if meal.value is not None:
        print("I really wanted cheese...")
    elif cheese.value is not None:
        print("Cheesy comestibles!")

    return_to_library()


wait()

You can view the full example here

The BOC runtime ensures that this operates without deadlock, by construction.

Examples

We provide a few examples to show different ways of using BOC in a program:

  1. bocpy-bank: Shows an example where two objects (in this case, bank accounts), interact in an atomic way.
  2. bocpy-dining-philosophers: The classic Dining Philosphers problem implemented using BOC.
  3. bocpy-fibonacci: A parallel implementation of Fibonacci calculation.
  4. bocpy-cooking-boc: The example from the BOC tutorial.
  5. bocpy-boids: An agent-based bird flocking example demonstrating the Matrix class to do distributed computation over cores. Note: you'll need to install pyglet first in order to run the bocpy-boids example.
  6. bocpy-primes and bocpy-prime-factor: parallel prime sieve and Pollard's rho factorisation, the latter coordinating early termination via the noticeboard.
  7. bocpy-calculator: a small Erlang-style calculator service driven by send/receive.
  8. bocpy-cooking-threads: the cooking example written with plain threads, for comparison with bocpy-cooking-boc.
  9. bocpy-sketches: the cheese-and-spam sketch shown above as a runnable script.

Why BOC for Python?

For many Python programmers, the GIL has established a programming model in which they do not have to think about the many potential issues that are introduced by concurrency, in particular data races. One of the best features of BOC is that, due to the way behaviors interact with concurrently owned data (cowns), each behavior can operate over its data without a need to change this familiar programming model. Even in a free-threading context, BOC will reduce contention on locks and provide programs which are data-race free by construction. Our initial research and experiments with BOC have shown near linear scaling over cores, with up to 32 concurrent worker sub-interpreters.

This library

Our implementation is built on top of the sub-interpreters mechanism and the Cross-Interpreter Data (XIData) API. As of Python 3.12 each sub-interpreter has its own GIL, so behaviors scheduled by bocpy run truly in parallel.

In addition to the when function decorator, the library also exposes low-level Erlang-style send and selective receive functions which enable lock-free communication across threads and sub-interpreters. See the bocpy-primes and bocpy-calculator examples for the usage of these lower-level functions.

For cross-behavior data sharing that does not warrant a Cown, the library also provides a small noticeboard — a global key-value store of up to 64 entries. Behaviors can notice_write, notice_update (atomic read-modify-write) and notice_delete keys without acquiring any cowns, and read a frozen snapshot via noticeboard() / notice_read(). The bocpy-prime-factor example uses it to coordinate early termination across worker behaviors.

Additional Info

BOC is built on a solid foundation of serious scholarship and engineering. For further reading, please see:

  1. When Concurrency Matters: Behaviour-Oriented Concurrency
  2. Reference implementation in C#
  3. OOPSLA23 Talk

Trademarks This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft's Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.

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

bocpy-0.5.0.tar.gz (251.5 kB view details)

Uploaded Source

Built Distributions

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

bocpy-0.5.0-cp314-cp314-win_amd64.whl (237.0 kB view details)

Uploaded CPython 3.14Windows x86-64

bocpy-0.5.0-cp314-cp314-win32.whl (233.7 kB view details)

Uploaded CPython 3.14Windows x86

bocpy-0.5.0-cp314-cp314-musllinux_1_2_x86_64.whl (468.9 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

bocpy-0.5.0-cp314-cp314-manylinux_2_28_x86_64.whl (475.1 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

bocpy-0.5.0-cp314-cp314-macosx_14_0_x86_64.whl (241.4 kB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

bocpy-0.5.0-cp314-cp314-macosx_11_0_arm64.whl (236.2 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

bocpy-0.5.0-cp313-cp313-win_amd64.whl (234.9 kB view details)

Uploaded CPython 3.13Windows x86-64

bocpy-0.5.0-cp313-cp313-win32.whl (231.5 kB view details)

Uploaded CPython 3.13Windows x86

bocpy-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl (468.4 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

bocpy-0.5.0-cp313-cp313-manylinux_2_28_x86_64.whl (474.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

bocpy-0.5.0-cp313-cp313-macosx_14_0_x86_64.whl (241.6 kB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

bocpy-0.5.0-cp313-cp313-macosx_11_0_arm64.whl (236.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

bocpy-0.5.0-cp312-cp312-win_amd64.whl (235.1 kB view details)

Uploaded CPython 3.12Windows x86-64

bocpy-0.5.0-cp312-cp312-win32.whl (231.6 kB view details)

Uploaded CPython 3.12Windows x86

bocpy-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl (470.0 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

bocpy-0.5.0-cp312-cp312-manylinux_2_28_x86_64.whl (476.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

bocpy-0.5.0-cp312-cp312-macosx_14_0_x86_64.whl (241.9 kB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

bocpy-0.5.0-cp312-cp312-macosx_11_0_arm64.whl (236.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

bocpy-0.5.0-cp311-cp311-win_amd64.whl (235.0 kB view details)

Uploaded CPython 3.11Windows x86-64

bocpy-0.5.0-cp311-cp311-win32.whl (231.7 kB view details)

Uploaded CPython 3.11Windows x86

bocpy-0.5.0-cp311-cp311-musllinux_1_2_x86_64.whl (466.4 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

bocpy-0.5.0-cp311-cp311-manylinux_2_28_x86_64.whl (472.2 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

bocpy-0.5.0-cp311-cp311-macosx_14_0_x86_64.whl (241.5 kB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

bocpy-0.5.0-cp311-cp311-macosx_11_0_arm64.whl (236.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

bocpy-0.5.0-cp310-cp310-win_amd64.whl (235.2 kB view details)

Uploaded CPython 3.10Windows x86-64

bocpy-0.5.0-cp310-cp310-win32.whl (231.6 kB view details)

Uploaded CPython 3.10Windows x86

bocpy-0.5.0-cp310-cp310-musllinux_1_2_x86_64.whl (458.3 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

bocpy-0.5.0-cp310-cp310-manylinux_2_28_x86_64.whl (464.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

bocpy-0.5.0-cp310-cp310-macosx_14_0_x86_64.whl (241.7 kB view details)

Uploaded CPython 3.10macOS 14.0+ x86-64

bocpy-0.5.0-cp310-cp310-macosx_11_0_arm64.whl (236.7 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file bocpy-0.5.0.tar.gz.

File metadata

  • Download URL: bocpy-0.5.0.tar.gz
  • Upload date:
  • Size: 251.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.5.0.tar.gz
Algorithm Hash digest
SHA256 8b8c380b0c5c7ea1052ecc9cad59c062375588744f0b089e34735664ffe10782
MD5 cc6b63766ee16559aa38acd4d426aff1
BLAKE2b-256 d06b1034765e3ad0266bef27ffc6b3f35b4986634319de5f125ada3f24791c6e

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: bocpy-0.5.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 237.0 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.5.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 6849c11a426a1d9e548769d799101eeb7ec3a98b6e3163232b2b203d3a069b59
MD5 fd17730cee8fcd4d94989b89a05839d6
BLAKE2b-256 a7a702648c8b6ef7ba076ca00a0c45c68b327e7595500e0c3d65b65d6564e898

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp314-cp314-win32.whl.

File metadata

  • Download URL: bocpy-0.5.0-cp314-cp314-win32.whl
  • Upload date:
  • Size: 233.7 kB
  • Tags: CPython 3.14, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.5.0-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 cdeae4789ba0c8590fd6dceff772837debc26d0a23dfe424946351eb023bfc91
MD5 654016c52ba2f26906915e5e89246ccf
BLAKE2b-256 d5f05aae114685cf721ab457661e9ac2d8d681b6db89d5c16549b736503c3dbf

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a09098a65915e70a6f177a5b24a295d10f74cdcf97c176ceacdbcf3a77370001
MD5 ad5ea7d062c3c0aeab7be366681218c6
BLAKE2b-256 09e37870177eccea172b8f02df243d02b892fc44be3256088e830366d576d486

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d4c1ac0e408c90e7829ddfbcecb8838e52e5ef6558d006adc1d6c29cec1225d9
MD5 85190ee7e577a6c78b4d2fa9eaaa4cdf
BLAKE2b-256 4452ab35e49b6ef1c0e7e4f048cc9ba3e1c1f63ac1f72b266a9bf4b7c6d82340

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp314-cp314-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 59ef70d14c67841140c8c2f87c4397fc8756af6a384542a713c25c78ebd31165
MD5 c0a07362abde92d6cd4591c26f3d844a
BLAKE2b-256 2cbc9502b6776d26d0b99291a073e089c483d4e4109d8deb11ab6b9d9e44ea91

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6ce5a2df0c0dd8b2572e45bb6361620387dadc8b8354f1c765a014ebc5f319af
MD5 94d78dcb8b567916ad9ee6ca0e996571
BLAKE2b-256 b544682bb40eeea44794499d879b436470fe559bdf2f34f7148f999983b41585

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: bocpy-0.5.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 234.9 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.5.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 08e4bb67b404ff9fa045ea0b3d59d32fd537c5f47ba594c9ea4885841492f10f
MD5 8bce3fd584bfe24089e181b68beaacd4
BLAKE2b-256 1b98e4167653d634d546daf85189b16693e5cdb69682ac79ba06cb73c1f27ab1

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp313-cp313-win32.whl.

File metadata

  • Download URL: bocpy-0.5.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 231.5 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.5.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 4cf2dd37b7b1f840d99c656390028d7fe78b564b046faff189b686b3f2eb4e74
MD5 b17c24fa89a23fa123cf25b5058bf721
BLAKE2b-256 3372d386ab0e62abea9c9c79bdf1c75927561c8b8fefea7723b671d606e9cc12

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6256ea32954d1c62ab8b0e2b83119529732b9519ccd9d6e85c16af17d35dad67
MD5 0f6bb83c4a9fca7c9ddc0b379453d6be
BLAKE2b-256 928a95e8e3ce587c90e2aa584238068529006d2e3ed0f458b846ad65452aaade

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c0b452c9fb343834304c84f2d1db72c7611f8210eb9ebfc5d6ff5d73ac1103f4
MD5 c618461582771a7945e734d9407217e0
BLAKE2b-256 b33c1035208df6033ed1fd6f4824f826cccfc3d178a41c8b67eedea34f5048d2

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp313-cp313-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 55f876983173c58fd63e91f26344c1f3ad69377dbe0984635674bea0bb4bfbc5
MD5 95c5af0eb8c5424df3ee72b00b576dd1
BLAKE2b-256 0e94db0c4059282f994adf6d0cef690f87148c2f4b1d14d623c68150520b41fd

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1bcaea60f4b2ebe54e0ebd7fe1554de85f077f28153ca3fdd28987218fc5ee25
MD5 c5e3835525afe426072593c4bdc499a5
BLAKE2b-256 72d5b774d8074bb49a577cc0cee69a0aea47448040273999a94e0312eee214fa

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: bocpy-0.5.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 235.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.5.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 09e37ce325798a3d0752ae2c6a0a293e1cf5220a092ac285ab96241cbc9a2875
MD5 bfaa0477fc758c7f9843aa459a754b90
BLAKE2b-256 503bc8f5be859561a48ca1c459816b8a208afc4792ddceb19d400fc20de3a7d9

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp312-cp312-win32.whl.

File metadata

  • Download URL: bocpy-0.5.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 231.6 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.5.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 f79cf13394c6b5dac17283ae40158a1b9a0bbef35bcabddfb0a34a07db205bd7
MD5 97e3d237cf285d99ea442a15c8abc0a9
BLAKE2b-256 92b728d9c66b898b0f92d1456191881cfa21e6ea117117e7f6d328ae04061498

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 18910b936c7d1a9b6745dd09c542b5297c1e7e1f2367b73874f79ba26ad6f0b6
MD5 17a1ddc9f14520f701d50e06c5229da3
BLAKE2b-256 230a52286f2da91aea40b862dc13470a693ed0153210443dee36a5bd22e2fa88

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 887280520b8a3af578b69d52990b42aee3ef4f6440002e8a8312bb0f5e3c51be
MD5 deccd6e5205b6a3c098307035b8bfe33
BLAKE2b-256 6e4ed151a968213b6f3a8fc0f1f32775a08320635f2a7b877bde44c08d507105

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp312-cp312-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 7f06bdda9ff9786e5634e18b97bedf1dab270b0e08bea40f9690ee4bfe8c1bce
MD5 1a82689a73699e1731071ed548b1c966
BLAKE2b-256 d33c0aa86d6970b9cee732ef2070d2fc0caea0af8e8fd99c6c43733c09303612

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 11cf61a5330002f0b96bfff6fdef8a6f3607908b17551038fc8076147b6a9040
MD5 6a6844b156d5d5270f80fd257e1143b6
BLAKE2b-256 ab4d96d851e22ca7e5efcba0256197b98419cc2e03fb3be0259d65914b38c09e

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: bocpy-0.5.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 235.0 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.5.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 12c16bf2f549e7a56a9b2ec74fc5f64f150803a3dc168fe2dea10e5e3aad6b54
MD5 dbec8aaefcaf131d1912de1a5acf187a
BLAKE2b-256 54dc4b27c9ef23a492fb6d1c7d86ae3ba3ca204366de3b1f556ed1b77d9e4f03

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp311-cp311-win32.whl.

File metadata

  • Download URL: bocpy-0.5.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 231.7 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.5.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 2f2b94e819fc5b3dd10224161e8cbaabee4c6eede060bafeab997206948f716c
MD5 020c28f8245fc17522e0b7440e633764
BLAKE2b-256 4f048b96bb3ac0d1f0172c8293d5d6129b2d314f63c11050841056ac66fff336

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3162df870a1c8afc52467930a7f88f871c47d4a9390a3935dfd73e9993277b0f
MD5 937a9fd0c07ed7294bf3e524104acf6d
BLAKE2b-256 16851b0c93201a0d7bfa023af6f2f352a63713a5c17dcf93a233b65a0ffe0251

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 58772ecbb2296b3a22370a22cf1dabfdf6091b11fa9e090f54e2eda9cd728c02
MD5 51ee4ccfc11669f1e3ba5a243c03d27d
BLAKE2b-256 c968fdde7a3a9faa6033b6190591d07210769ab21d7eb67ca79ea7d887c9214b

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp311-cp311-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 469021d0ec4f4cb51b6cc42703fcd705b9ff105139031fca34078611ba6812e6
MD5 2e2257ed982db6455ca755ca299d1219
BLAKE2b-256 9eb9980f4237ed6c35c2a84f8f26525cddd5c9c722e456c7d81a654cd276866f

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 687d48953a6cde80b899643253ad644e581b75adcea53a69c3f53946f29dc580
MD5 d523a9dd44ec8d802014681049ad3bdb
BLAKE2b-256 de49cacf9b5cc9269b17b0a8ce3d7b03f74077d1dff64361d9ecc28ffa6edb2c

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: bocpy-0.5.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 235.2 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.5.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 60ea7165d894f192a6b1ef6ec376f85839b52c244eb5aab2d2f8767bf387217f
MD5 9281fdcbfefdf5bf0cf68f859e63d605
BLAKE2b-256 775e88a8bb360873fdd26174738558cbe564b6a049ab247b8e8643fff7f9a2ad

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp310-cp310-win32.whl.

File metadata

  • Download URL: bocpy-0.5.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 231.6 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.5.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 1cc95a19c5b3a4d769fd92213b1355309f169ac05aa6bc388bb49342206f0875
MD5 444b5e6967198a9904a3381915b70751
BLAKE2b-256 c3c5c1a2278946f3263dcf476ac27d04d394bb4d464c468da3d8204c59a6afa7

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ea8ae8d570ee637793348530af9b7154a6a50d85d6f282f6a0d4546fc3d9c6a6
MD5 fee8e6dc73c9fb57ef8adf1c5a855f24
BLAKE2b-256 91d6896f0f0a1e7be44e42b54bcf2b27c4eb565cedd13fc7ec14f24a13f0c71e

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 073501bddcd658469a852f99d354f4fcb1f64fd81fb912137b1d3289a782fcef
MD5 7d7e7a62e1fff8fb9fe0fc22140911b9
BLAKE2b-256 b04a850e7d499de6b6836afba595b615ae1d8456a8b78f19dfbe1c8929d24ba5

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp310-cp310-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp310-cp310-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 a08b6618597232abeb261424f16a96cbca14bf994433d02ab3d3fc5931164618
MD5 5f3e4b732b886e35f335f1f17d232e83
BLAKE2b-256 d60cd02badf7f1ffc5960433110ee14f07be614eeaaff483457ee3aef034a2dc

See more details on using hashes here.

File details

Details for the file bocpy-0.5.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bocpy-0.5.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0b785ff3cd29ad6f7154f813f196cfea0e828693991fb6897d40b66e437507ea
MD5 cff18c2a1be1c02411fa6426c28ddcfc
BLAKE2b-256 61441fe0e53a13d7834b8f51e69a533a406790e2b654ec1f67662765e22fa944

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