Skip to main content

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, exclude=exclude):
        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.

Talking to main-thread objects

Some values can't survive an XIData round-trip — pyglet shapes, Tk widgets, open file handles, ctypes pointers into a library loaded by __main__, a GPU context. Wrap those in a PinnedCown. Behaviors whose request set contains any pinned cown run on the main thread, drained by pump() from your event loop (or implicitly by wait()).

Keep dispatch coarse — one pinned @when per frame, not per item — so the single-consumer main thread doesn't serialise your worker parallelism. The pump() call drains whatever pinned behaviors are queued and returns immediately when the queue is empty (it never blocks), so it is safe to call from a tight render-loop tick. Hosts that want a starvation warning when the queue stays non-empty can enable it explicitly with set_pump_watchdog(); with no call, the runtime stays silent.

from bocpy import Cown, PinnedCown, pump, start, when

start()
canvas = PinnedCown(MyCanvas())  # main-thread-only handle

def update(dt):
    pump()                                     # drains prior frame's write-back; returns immediately if nothing is queued
    results = [worker_compute(i) for i in range(n)]  # per-item worker @whens

    @when(*results, canvas)                    # one pinned behavior per frame
    def _writeback(*args):
        *cells, canvas = args
        for cell in cells:
            canvas.value.draw(cell.value)

See the Pinned Cowns guide for the coarse-grained dispatch pattern, event-loop integration recipes (pyglet, Tk, asyncio), and the starvation watchdog.

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 for parallel per-cell physics on workers, with one PinnedCown-driven @when per frame batching the pyglet-visible write-back (the coarse-grained pinned-dispatch pattern). 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.

For values that can't survive an XIData round-trip — UI handles, GPU contexts, file descriptors — the library provides PinnedCown, a cown whose value lives permanently in the main interpreter. Behaviors against a pinned cown run on the main thread, drained by pump() from your event loop or implicitly by wait(). The full surface is PinnedCown, pump, PumpResult, set_pump_watchdog, and set_wait_pump_poll; the bocpy-boids example drives a pyglet window through one pinned @when per frame. See the Pinned Cowns guide for the coarse-grained dispatch pattern, watchdog, and free-threaded support trajectory.

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

For a synchronization checkpoint that does not tear the runtime down — e.g. a parallel search that inspects a best-so-far cown between rounds and then continues — use quiesce() instead. It blocks until every in-flight behavior completes, optionally returns a per-worker stats or noticeboard snapshot, and leaves the worker pool and the noticeboard thread running so the next @when call dispatches immediately.

from bocpy import quiesce

snap = quiesce(noticeboard=True)  # dict[str, Any]
print("best so far:", snap.get("best"))
# ... schedule the next round of @when calls ...

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.

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.13.0.tar.gz (391.4 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.13.0-cp314-cp314-win_amd64.whl (207.8 kB view details)

Uploaded CPython 3.14Windows x86-64

bocpy-0.13.0-cp314-cp314-win32.whl (201.6 kB view details)

Uploaded CPython 3.14Windows x86

bocpy-0.13.0-cp314-cp314-musllinux_1_2_x86_64.whl (546.9 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

bocpy-0.13.0-cp314-cp314-manylinux_2_28_x86_64.whl (557.4 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

bocpy-0.13.0-cp314-cp314-macosx_14_0_x86_64.whl (218.9 kB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

bocpy-0.13.0-cp314-cp314-macosx_11_0_arm64.whl (209.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

bocpy-0.13.0-cp313-cp313-win_amd64.whl (205.3 kB view details)

Uploaded CPython 3.13Windows x86-64

bocpy-0.13.0-cp313-cp313-win32.whl (198.8 kB view details)

Uploaded CPython 3.13Windows x86

bocpy-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl (546.0 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

bocpy-0.13.0-cp313-cp313-manylinux_2_28_x86_64.whl (556.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

bocpy-0.13.0-cp313-cp313-macosx_14_0_x86_64.whl (218.8 kB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

bocpy-0.13.0-cp313-cp313-macosx_11_0_arm64.whl (210.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

bocpy-0.13.0-cp312-cp312-win_amd64.whl (205.4 kB view details)

Uploaded CPython 3.12Windows x86-64

bocpy-0.13.0-cp312-cp312-win32.whl (198.9 kB view details)

Uploaded CPython 3.12Windows x86

bocpy-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl (548.1 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

bocpy-0.13.0-cp312-cp312-manylinux_2_28_x86_64.whl (559.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

bocpy-0.13.0-cp312-cp312-macosx_14_0_x86_64.whl (219.1 kB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

bocpy-0.13.0-cp312-cp312-macosx_11_0_arm64.whl (210.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

bocpy-0.13.0-cp311-cp311-win_amd64.whl (205.2 kB view details)

Uploaded CPython 3.11Windows x86-64

bocpy-0.13.0-cp311-cp311-win32.whl (198.7 kB view details)

Uploaded CPython 3.11Windows x86

bocpy-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl (542.1 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

bocpy-0.13.0-cp311-cp311-manylinux_2_28_x86_64.whl (551.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

bocpy-0.13.0-cp311-cp311-macosx_14_0_x86_64.whl (218.6 kB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

bocpy-0.13.0-cp311-cp311-macosx_11_0_arm64.whl (210.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

bocpy-0.13.0-cp310-cp310-win_amd64.whl (205.4 kB view details)

Uploaded CPython 3.10Windows x86-64

bocpy-0.13.0-cp310-cp310-win32.whl (198.6 kB view details)

Uploaded CPython 3.10Windows x86

bocpy-0.13.0-cp310-cp310-musllinux_1_2_x86_64.whl (533.3 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

bocpy-0.13.0-cp310-cp310-manylinux_2_28_x86_64.whl (542.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

bocpy-0.13.0-cp310-cp310-macosx_14_0_x86_64.whl (218.8 kB view details)

Uploaded CPython 3.10macOS 14.0+ x86-64

bocpy-0.13.0-cp310-cp310-macosx_11_0_arm64.whl (210.2 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for bocpy-0.13.0.tar.gz
Algorithm Hash digest
SHA256 46f13555cf1cbdb0dec643cc5fe03e3969a6dafa2b966a8becc677656ed4d2a2
MD5 f7d2fa883da6cdd5bb45ad98c27c3dab
BLAKE2b-256 05867dec04097a5c2c5db6c50edb618cc1e05b230b643eda3d8e12f0ff863696

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.13.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 207.8 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.13.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 b77987b0a73df834dc236adf6052af9c113a3c5717a96f5682cb20fbd26d059e
MD5 cfd7d2bfa07eaa360a55a5874ebf59ee
BLAKE2b-256 5ecaf5e1f18350d914e48ad7e2e13700a42a829d1f02a9fcbd70587ef8916f47

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.13.0-cp314-cp314-win32.whl
  • Upload date:
  • Size: 201.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.13.0-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 80a87723335a629e85f176c986d1942b2061043583b99d77bfd038a72fdb1f7a
MD5 ebd3aa6c790edc4586b0b38fb3159875
BLAKE2b-256 b949f214dde6a18c4f8c219ddb932c72d7530d4b340ba0bf2cf4318a0a7dce7b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a5ddea7112154b75700c43423dac7c724e9e620b68bcf6a9f78331e8e31cede5
MD5 428e316660d38f70326dbdfba9b0aa5c
BLAKE2b-256 132db37fa04c77fbada781f4d26ff15c6dcd91543405fa1cf2be010e18119413

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ff68df63dd99072a50b35649010015475da42eb3035cd6c2e5e6df5a86505d46
MD5 2212d5677d3a3fdeefb16911a9adafda
BLAKE2b-256 dbd8932162adc8f0f5504a60bd3425160f4356238b10f1b9613d538a89da80ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 53c3a3712c79cbd938530f79049b5a83bcc8af1fe2f7e88d19eeb5c845a91c6d
MD5 c6fcca535d8d032043f6bdbd250c4c06
BLAKE2b-256 9719d69df9855f83109e995ec4f465a30c4e267a7389da1a6bfdb295afdf80ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c251a6323ae46ccbe6ecdeffe502196be9b844ac73bf71b2747e73d9e73c6546
MD5 a817444d153412cf3259a2440f735004
BLAKE2b-256 884fc23d636d05c2972b05616876cef88d80f62d92d25212d16dc6178100d03a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.13.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 205.3 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.13.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 452a08dceb584c4c6e7055d273517cf3d601607679fbf7405fc18eb643e3ab80
MD5 36628d9c76e18d74b10bd8a752b25e1a
BLAKE2b-256 4c1f59fefd7b6fa2bd0297f180dcb5096f30e366c2fa022d0803f2e48a16dc74

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.13.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 198.8 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.13.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 42c26e8367e952db0129f1fd4cf0267be29a3c37aaf65472b752597131600e90
MD5 82af28ce62ce0bd7831fc0189d065106
BLAKE2b-256 7ad25415c966f51611d1951adfc5a04c504f2dc3e2a34e320c63972ecce949b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c5d8a29c55a63090156c95b63b0ea41bd76d403ce515a6790203f90b3991ddad
MD5 1eb475a18b1ce26e36fd9e451d8422ba
BLAKE2b-256 d42235aa61415e895f57a0e30afe7b5895729994b27f7d5396a42088a126f308

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 43831c4fa79b3b28bf0e3a6468673c686612ad5ca22fc6bc9176fed760fff6ef
MD5 a6a786e6515a47fb43729feb7e099682
BLAKE2b-256 2516a1b3508db5e1b406b72f60b16ef9717f5861c1fd21ee3f8faaaa7bf7e011

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 a6f5ac51b20388c5d23bccc8593f8200f44bd26230c30b24199e0b125831efb6
MD5 ecd3a027483266deeb9052a5acc0ae48
BLAKE2b-256 073063dc5558a8520c4bd2271ac0f6ad9732e079094988e52d3b2c1b509460df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 48148c0965fbd8897617f87df2d55f09b739349613e90b9857931efcf82e5e03
MD5 40558a2e8e85c3f14d4375ccd278fb7d
BLAKE2b-256 9988b10a3bcf26ce2bda2b0771be98a601d39c5d72c84490b7e491b85d12d6e3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.13.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 205.4 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.13.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4e8321e07ba0a728ae842db0f6096f25b29040b5475f1ccc534ddec370413203
MD5 a9ebcdd628cbaaaec0e2f5e8274bcb5b
BLAKE2b-256 4939127ce23057141e9004c580a0c5d66b63ca1cbcd75ab6797d1288da801e0d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.13.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 198.9 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.13.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 f4113ce58d1241b6d7f4ba48aac0675e3e730d719e5e4cf8141d55195ee844b2
MD5 23ce3dc86419e198e5a49f841efa3b47
BLAKE2b-256 408063247b530cea49b1fa3bb866113c4967c1f014fc789a6b99f95b386b5fdb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3e705e3b472b5b466e9691d12e8dd5480058db4eb818878109401ba96196df1e
MD5 75633909b4ad398964405eb86126cd4e
BLAKE2b-256 47b19450d0330ecafe23502a8b8275fcd7329937690b98ea63cf3eb15a725538

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f79cda132b3a1f42faea3a5408d7806e9bf205018f7694e5125ec82cfc15025b
MD5 07311ae815ef59a0c4a2331661c6c25f
BLAKE2b-256 801f2fd76ab4d24de3b08c8bd82d8e3c2de4608ba6bcc144f3b3fa9da5b26fd7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 08c04ee58f10584b4bfb06379a841b78b5752b83b9dfbba3a99c90f1030f62be
MD5 60eb02517de982ae96531481d6bf0af0
BLAKE2b-256 a471fbe2693ae6fbf494a9130a05d121301034a6ca43e2c16737b0ca0b5586ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 716fd40278adb1dc7c1f07d0cc38b06475e77958b3fc168263c004bc2df9e2be
MD5 68497ee0b48a92edde77b9e1c175586a
BLAKE2b-256 98e8c636b90915f41ef24ba3f4360c984dc2ee909486a81a8e1162bcb1e1182d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.13.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 205.2 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.13.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 619dbea9fa01d6aab5a93b9f1a695d5d10cb88d13b0b6f9719007c6c6053f289
MD5 729520ba63a4290ffb06e0059546c94d
BLAKE2b-256 3f8a5fde09b4c82d8c5aa8607044ee7fd12fe787dc6ac3e76b9ca051e36772c2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.13.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 198.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.13.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 c332616575a1929e52cc3c6d3af5e830ea43000aca9f3a824ffcbc9a748ae81d
MD5 06be8d3b4d4c08dc618845d1b70fdbef
BLAKE2b-256 7a39e2e0cb9a1e9a0c0f31529018b037818a99a72b2b83d3f2a9e5eb75d6b6b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 041783590c9ab9197dcca23ac127928bf2acbf4ea266541c74ec1110cab8dc4f
MD5 06922285329b3e908688058d48bdf6c1
BLAKE2b-256 271c1ac78818d4e1fc7f0dd4ffacec365f61954974e27d2ac31181a96902dadf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8ca162e56580ca6a47ea746b5f2adf84fe742bda74122a0ebf8b3a0a9434e6c2
MD5 61529e21b8ae642aa1fd20029456044f
BLAKE2b-256 89b011342ca653cbf14ddf549efc33af9b5e7f8e359de4f60ab057a5caf19ab5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 ced877463571ae15cfe52a1b7b276b0d8e9e9036c70d0885a4ea6d4bb77dc143
MD5 a06cd84f35eb8e97e1dd2ae24bfdec77
BLAKE2b-256 caee9f59eff721a0f75350bec5fba05598f3882d2b986c93cfe19016228a3077

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e22a0390f11ae2c9007580a20464226e70cd7a267515581b7961796d3f990723
MD5 677071bd1ec4f95bec2540106634505f
BLAKE2b-256 2e4d26688291d22b3c1931a401f0cf5eb8dcd66d0b9301293686d03b9800965b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.13.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 205.4 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.13.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b352c4704668c19776cb668378b0e1288da1d4e89187ddce0d898073cf4c7b37
MD5 6821a1e65c81537bb823d6a2f205ae3f
BLAKE2b-256 7b681222ec0086e6edc5efb2308d48fae90a8aa7172074dfa61b01537d4c1125

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.13.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 198.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.13.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 74ae466cf0f7a482d956491aa3dd25b831e4c5885d6a266de4e73b7c9f90912c
MD5 52d6de61bdc007778bf9e1365b053fb6
BLAKE2b-256 c0fdb5d9dd27b2ac0b4caee57e3aae7123b8d96a3278fa42bd59988b766b9b6c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 53c9cd75ac8c125a47a62c9b9ef05d7587ba00ae57ec49b091da8cdc0e7efe29
MD5 2371485782e7f620efcaabee717cc26e
BLAKE2b-256 64f478334630fb72fcdf56262b6cd839ce3ea105c43b4d22fde8f14ad72cb8da

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0e30c71c37aa6e55a644e5fcbfce391a720c79d1a4161a31f61fbb34a1c65b79
MD5 36ceea8041cb0579a28359396e552530
BLAKE2b-256 5fca3c8845ca73a14494dd3ea1077b766ff44ed453dd30a49b4ac1fdfb2bb95c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp310-cp310-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 742e515967dc9b4efdeb68916afc87d3df40336ce097f8b3e47eef7409bd6698
MD5 b8da6fa8175b469a35f3f5d81196303b
BLAKE2b-256 efb24b5eb6ed42bfb8791c6d5a40e04bc5d4127d21bceeb3f266d549924128ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.13.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b9461b699e131a22920e095016dfdff95fb81a80da68e2946e7a4f299387ab10
MD5 b2cbc2feb4d4bcaf555a0c687a7887df
BLAKE2b-256 d2581fb5615e5a54004dc3f23bea93029d16bd7cc8fcc15b263e2441ca8b5149

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 Sentry Error logging StatusPage Status page