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).

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?

Python has always had data races — compound operations like x += 1 are not atomic, even under the GIL — and with the arrival of free-threaded builds (Python 3.13t+) the surface area for concurrency bugs is only growing. BOC eliminates these problems by construction: because behaviors interact with shared data exclusively through cowns, each behavior operates over its data as if it were single-threaded. There is no lock ordering to get right, no forgotten acquire()/release(), and no possibility of deadlock. This holds whether your program runs under the GIL, on per-interpreter GIL (3.12+), or on a free-threaded interpreter.

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.

The core scheduling engine is written in C — it is not a wrapper around locks, message queues, or asyncio. Each Cown is backed by a C-level capsule that embeds an MCS-style queue of pending behaviors. When you call @when(a, b), the runtime performs two-phase locking (2PL) over the sorted cown IDs entirely in C (releasing the GIL across the lock-free link loops). Once all cowns in a behavior's request set are acquired, the behavior is dispatched directly to a worker — there is no central scheduler thread and no OS-level lock acquisition on the fast path. Releasing a cown unlinks the MCS node and hands ownership to the next waiting behavior in O(1), which is then dispatched without touching any shared queue. This gives bocpy the same deadlock-freedom-by-construction guarantee as the original Verona runtime.

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.

The library also includes lower-level Erlang-style messaging primitives (send / receive) for channel-based communication patterns; see the API documentation for details.

Waiting for completion

Call wait() after scheduling all your behaviors. It blocks the calling thread until every scheduled behavior has finished, then tears down the runtime (joins workers, closes the noticeboard). The next @when call will spin up a fresh runtime automatically.

wait()          # block indefinitely
wait(timeout=5) # raise TimeoutError if not done in 5 s

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

C API stability

bocpy is implemented as a CPython C extension that links against the private cross-interpreter data API — _PyXIData_* on 3.14+, _PyCrossInterpreterData_* on 3.12 / 3.13, and on 3.13+ the internal header internal/pycore_crossinterp.h (which requires Py_BUILD_CORE). Under PEP 689 these symbols are explicitly unstable: they may change shape, semantics, or disappear entirely between CPython minor releases, and there is no PyPI / setuptools metadata field that advertises this kind of dependency. The practical consequences are:

  • Per-minor wheels. Because we do not target the limited API (Py_LIMITED_API / abi3), every wheel carries a version-specific ABI tag (cp310, cp311, …, cp315). pip will only install a wheel that matches the running interpreter's minor version. The Programming Language :: Python :: 3.x classifiers in pyproject.toml mirror this set.
  • Source builds may lag CPython. Alpha / beta / RC builds of a new CPython minor frequently rename or reshape these private symbols. When that happens, bocpy's xidata.h shim needs an update before it will compile against the new headers; until then, install on a released minor version.
  • No CPython implementation other than CPython itself. The internal cross-interpreter machinery is CPython-specific, which is why the only implementation classifier we set is Programming Language :: Python :: Implementation :: CPython. PyPy, GraalPy, and other alternatives are not supported.

The compatibility ladder lives in src/bocpy/include/bocpy/xidata.h; the Py_BUILD_CORE #define / #undef save-and-restore there is scoped narrowly to the one #include that needs it, so downstream C extensions that pull in bocpy.h do not inherit it.

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.7.0.tar.gz (323.0 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.7.0-cp314-cp314-win_amd64.whl (167.0 kB view details)

Uploaded CPython 3.14Windows x86-64

bocpy-0.7.0-cp314-cp314-win32.whl (162.6 kB view details)

Uploaded CPython 3.14Windows x86

bocpy-0.7.0-cp314-cp314-musllinux_1_2_x86_64.whl (402.3 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

bocpy-0.7.0-cp314-cp314-manylinux_2_28_x86_64.whl (408.6 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

bocpy-0.7.0-cp314-cp314-macosx_14_0_x86_64.whl (171.0 kB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

bocpy-0.7.0-cp314-cp314-macosx_11_0_arm64.whl (165.7 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

bocpy-0.7.0-cp313-cp313-win_amd64.whl (164.8 kB view details)

Uploaded CPython 3.13Windows x86-64

bocpy-0.7.0-cp313-cp313-win32.whl (160.4 kB view details)

Uploaded CPython 3.13Windows x86

bocpy-0.7.0-cp313-cp313-musllinux_1_2_x86_64.whl (401.7 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

bocpy-0.7.0-cp313-cp313-manylinux_2_28_x86_64.whl (408.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

bocpy-0.7.0-cp313-cp313-macosx_14_0_x86_64.whl (171.0 kB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

bocpy-0.7.0-cp313-cp313-macosx_11_0_arm64.whl (165.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

bocpy-0.7.0-cp312-cp312-win_amd64.whl (165.0 kB view details)

Uploaded CPython 3.12Windows x86-64

bocpy-0.7.0-cp312-cp312-win32.whl (160.5 kB view details)

Uploaded CPython 3.12Windows x86

bocpy-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl (403.7 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

bocpy-0.7.0-cp312-cp312-manylinux_2_28_x86_64.whl (410.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

bocpy-0.7.0-cp312-cp312-macosx_14_0_x86_64.whl (171.2 kB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

bocpy-0.7.0-cp312-cp312-macosx_11_0_arm64.whl (165.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

bocpy-0.7.0-cp311-cp311-win_amd64.whl (165.3 kB view details)

Uploaded CPython 3.11Windows x86-64

bocpy-0.7.0-cp311-cp311-win32.whl (160.5 kB view details)

Uploaded CPython 3.11Windows x86

bocpy-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl (399.2 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

bocpy-0.7.0-cp311-cp311-manylinux_2_28_x86_64.whl (405.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

bocpy-0.7.0-cp311-cp311-macosx_14_0_x86_64.whl (171.0 kB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

bocpy-0.7.0-cp311-cp311-macosx_11_0_arm64.whl (165.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

bocpy-0.7.0-cp310-cp310-win_amd64.whl (165.3 kB view details)

Uploaded CPython 3.10Windows x86-64

bocpy-0.7.0-cp310-cp310-win32.whl (160.4 kB view details)

Uploaded CPython 3.10Windows x86

bocpy-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl (391.8 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

bocpy-0.7.0-cp310-cp310-manylinux_2_28_x86_64.whl (397.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

bocpy-0.7.0-cp310-cp310-macosx_14_0_x86_64.whl (171.2 kB view details)

Uploaded CPython 3.10macOS 14.0+ x86-64

bocpy-0.7.0-cp310-cp310-macosx_11_0_arm64.whl (166.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for bocpy-0.7.0.tar.gz
Algorithm Hash digest
SHA256 72554e9bcf5a695a390798235f40887d68a431c92130cbe47fc109964e522ac7
MD5 c440456397bb5e9e5ee63069db8149d4
BLAKE2b-256 209a311616acc372c59d5343520aede64ccedd67c31177a16e679d0146303e6e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.7.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 167.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.7.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 aa57be6c3083f7c7575112af0f92f73e2a12e39ae77afeeb1c977806d64a3863
MD5 c5d0b1e5b389c408a9a774fab54013cc
BLAKE2b-256 0d87723b6e309fed6716fc958e4fa5af886ecc0f579d4fae3aa756fa5e2e4864

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.7.0-cp314-cp314-win32.whl
  • Upload date:
  • Size: 162.6 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.7.0-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 9c37aed90e52e0ba7075d45441fbc7142e7bbdeedf2e9d4b6c6d9cfbdba7698e
MD5 03d8203f0b4748cc505d10bf55b63ac5
BLAKE2b-256 546ebafd778990190ad1f2e1b11d948dcfc9a07f4d9c189d6032b7c87e998861

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 35543d33fbc769c19cbb14a8cd57193033ed3f9c40bedee030a62577f1ebf5ee
MD5 67b90b0937cb7029f7b4c35b5b8099a8
BLAKE2b-256 5500f629c6dd61f337c3daa0c14223103e016476836650d49c2e804a8f3bf1d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 48a3bfffec59ec1fce2f23e438f08a31e969879f705cb7967a8d6b219e4f32f2
MD5 fe8ed771e1a0440d179ef6b342abf191
BLAKE2b-256 7f4850db5b1a1e22843f3f0ca0e547b27d0e03954bfed3851bf5f040c5f257d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 098697aa748b83ef1407fd2664cd424ea153437bcb7f13dae656f7b37a0c3820
MD5 205a901b80ba133bd7da1b7bf2620aa2
BLAKE2b-256 912b7aab05350927458c4d32effca2f9c36ce7d5a34570ae4e6b782964962a5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fcf11d90528253cc560325653af4498ad1ef3ea4d76bd23588716d784f3d53c1
MD5 4ccb074c9522a444458e99192b5d4d44
BLAKE2b-256 1d584929e1574aa10fc6d1ae261d5f7aaad2711668f8175547877b18674de0be

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.7.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 164.8 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.7.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 df6a6de33b36a1654fa45152f02f8974bf443ea78d82bc2c42cbb7519a1c1043
MD5 fe99cdbed38ae3103f710d49a39633c5
BLAKE2b-256 918c40963c3d76f4d1886124e42e74f5ddadbb6e8ae181035ff88bd232bb72b2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.7.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 160.4 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.7.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 09ef876a5fe52afc5986126ae6936ad3db93659500160a61c87f95ed270756d9
MD5 9bd336b66cf77a79286bd6cca200cd8f
BLAKE2b-256 f8c668ccbc2c75cdd5ff4ac18d0c386c7a7114cfee9bdf9a1994f9c9761e1855

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0cf36b42bd22f88859a398c7468f67dfb83df5e33b67544452202cea53a480a0
MD5 3c30ec15418758606cba92cffbf04812
BLAKE2b-256 bb70d71486347e3ba6f8432d5f93ab81015d6f995d47aef5511c968316a8c29a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 94947007f80e623f4650321bd72ef7038d0d528a4643fea5f9839c967fb9a1d5
MD5 e3dcc344132c9f7c3b0d17a18cf9b753
BLAKE2b-256 3c48219167e4d0f695e7b38a7e65e12ecc7a18a74e49e1677486db5563350230

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 8c390c7725d5ff1d0f349cc6faf2becd624bc9d4b6d13ba54f9a9c15d21f1f80
MD5 6bae0d443bd71e30a26d3045a6e71235
BLAKE2b-256 e4ffc6e3966e71711400c7f06cf4afb6f5370b8cdcc44d3bce7d187dff4fb5c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4538819513066c8a3e8c51108e25e35a38d7bb489a564793d77c72d474fc1b85
MD5 a8f0ebf7dafd6084f89b6c8f122dd4ed
BLAKE2b-256 8abb94a3e4e62962d8ff0d284110578ad8534affe51c770c222f8e4040e7ec22

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.7.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 165.0 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.7.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d78e7991168c3a993987f417f437692b46c929dd4e0124f84cd62c3f7fbf326d
MD5 db8a567f1ebbf118959b8ea6e25b3498
BLAKE2b-256 30fcfbdb8918c826eb6fca6db8d1fbc020cf1666a73d5c481181b7733edcd91e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.7.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 160.5 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.7.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 a2d5f3c8190206b4aa076e7afb4e57f188f58b6b7fd7412a6df11aa9b9535580
MD5 104b5ed022afb43b81c6c0865fa695ee
BLAKE2b-256 0d06a384bf871f914e4248621cfeba6fb78cef12c95e2511e7f873905efb18c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5669afc8f47710931e0cb23036bb41bd993440e259a838cbc697f9eb8192916c
MD5 a66dd4dc5426f58220635afae8387980
BLAKE2b-256 b65621a0eb3b46cf0641433c45b693784d92b62bc58a71cb3c00880dfab74512

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7a6c598e4d1a2fb6acf26736b4e98d74505783e4bafc73bd066c34abe6e42300
MD5 72a11d2d04730bd6083a7c2026ab1ac1
BLAKE2b-256 237230eb9ded6606828bf52c5baa64003428bcf531a9a76725ed3448f5d03e56

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 cd2aad379b4aef92f686317a048ce0158879546faa2ddfdf2187ed62256a65c6
MD5 e61848d255a503398453f69ecd17f880
BLAKE2b-256 10921cd88dcb55d5c59fed6d7cba3f1bb2b8b8be5e6b46bdabfe953c53789d9e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e5a5fe101015b46ea41098ac6dae9ac37e715f405d40597bfa0edd127aa018e2
MD5 ea745e6f01386119cd3e725a209a2649
BLAKE2b-256 209ddd5837afa522a8495c2cd6355a1345b147b75922bdc352da044557964540

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.7.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 165.3 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.7.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 1045f94451443caef27128bc2b0a1335abd856e1255d2dc57e00c47ceac76bb6
MD5 034ea8b5717390b4f9998a31827b11c1
BLAKE2b-256 0cd67fc860750f488b0d2ffcdd3ac108eec7136a5bb2cf19b2215ca9ff94afff

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.7.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 160.5 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.7.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 92e785443889f288e69110ef472571949b1af4b73c660ad4f216fd398d33c7d3
MD5 b187a20d50f6b9c4972e0e5664170eeb
BLAKE2b-256 37edf52c9c27d79327fd2b56aeb4ba862ff85e6964b2dd0260926369eab2199a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e24507ff11835575675826366b8cf15f8cfc6aa1aea442284b4de54169466db8
MD5 6812ba6df2e0a53bc4dadace38d32320
BLAKE2b-256 6cea314a03a3e383c036672d170f2f76b8e69d628314d72e37429ee7210dbf1f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 91c02aa7b51b3e93e0e9825330db01e1fd4cbe65e28a3c63942e77a95aa889c1
MD5 0e20cf5a3e5c5ccbd4599482c9230f4a
BLAKE2b-256 d58c3772d8fc2dde54f1bf5467c690c3847447a47b73d3680965aec2540d2026

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 e25eb34b39bf6f6104968733a26460da473523e41ae15ef82f61f28b1862f40a
MD5 0423acaa308d6221e8e2c378266c8408
BLAKE2b-256 1c5a4232dfa4756de4af9df72da85eb5a76a854f2dbb69079a9427f990115b3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fc8dad3b48e4d0d04614c312827a7b49a754ac1d81ac076bc789e17af10c8ee8
MD5 871641c4e8edfd976b58db92c0cdd0fd
BLAKE2b-256 1d51257f5e3000113ce8d8c346ed13bc93fb8da011613bf7a3c144f1d8ea65c7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.7.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 165.3 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.7.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 63ca0c9e5a81c2464357e6386427113c72433c3ab95ed5c07fc14e5e8249a15c
MD5 386c373bd79a422db812ed1374147592
BLAKE2b-256 920ebad9eaf018d72dd7f8167cb23cd9a4238131499f1e1533fdfa20b9d71491

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.7.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 160.4 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.7.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 ae0a1cd98dfb9f747ad0e8e3463167eb7d0645249ef3b590c354c67b2127520f
MD5 a7b17cfe77b047c565838fe2f0b41584
BLAKE2b-256 b2c38014a6c538529b7df88f729a3f76a58f86c4bdeeadf35e7f1514aebd92d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d1db4bdb83b2381a658ac12f44446af48eab98ddae1690d794d1a433e5750fff
MD5 fab90195c2f0ef146c73284415cdb1fd
BLAKE2b-256 2951c6cba18988b2bdc2d7d51670e0acb9601e9cf76b33f3d53f3bbb73bb22b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f62a7a50025e6f47799973b0a1727d70ebf6fd9ee59bb3bdf376a61b66d2ba3e
MD5 be16d991ab1146e0478848cd0a53f2d3
BLAKE2b-256 c709dbd89483b75cfcfb2932bb855d8a5206e407a034e033aad3b6adbe2b5938

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp310-cp310-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 864c768bb2105b902ac6bec0a1dca35f09b3da0ad2434c7713cccc29cb7fded5
MD5 ff734346fc674b018b047182fe56e5c5
BLAKE2b-256 f154981bfdc31df8a5ce759c60b0bfc1a94c93980dde0cec0403cafd28cbb2bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.7.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0e487c03b2a222937bd84cd08ae5579946133aafbec9166bab5c9919a8386a83
MD5 07e710c923ad228c5fcc70a098992573
BLAKE2b-256 88431a9d8b98279ee244cab08c378f0b489c963a68e008a4bca7f3276b1e645a

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