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.14.0.tar.gz (445.8 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.14.0-cp314-cp314-win_amd64.whl (232.6 kB view details)

Uploaded CPython 3.14Windows x86-64

bocpy-0.14.0-cp314-cp314-win32.whl (223.6 kB view details)

Uploaded CPython 3.14Windows x86

bocpy-0.14.0-cp314-cp314-musllinux_1_2_x86_64.whl (638.0 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

bocpy-0.14.0-cp314-cp314-manylinux_2_28_x86_64.whl (650.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

bocpy-0.14.0-cp314-cp314-macosx_14_0_x86_64.whl (248.7 kB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

bocpy-0.14.0-cp314-cp314-macosx_11_0_arm64.whl (237.1 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

bocpy-0.14.0-cp313-cp313-win_amd64.whl (229.7 kB view details)

Uploaded CPython 3.13Windows x86-64

bocpy-0.14.0-cp313-cp313-win32.whl (220.3 kB view details)

Uploaded CPython 3.13Windows x86

bocpy-0.14.0-cp313-cp313-musllinux_1_2_x86_64.whl (637.1 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

bocpy-0.14.0-cp313-cp313-manylinux_2_28_x86_64.whl (649.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

bocpy-0.14.0-cp313-cp313-macosx_14_0_x86_64.whl (248.7 kB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

bocpy-0.14.0-cp313-cp313-macosx_11_0_arm64.whl (236.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

bocpy-0.14.0-cp312-cp312-win_amd64.whl (229.8 kB view details)

Uploaded CPython 3.12Windows x86-64

bocpy-0.14.0-cp312-cp312-win32.whl (220.4 kB view details)

Uploaded CPython 3.12Windows x86

bocpy-0.14.0-cp312-cp312-musllinux_1_2_x86_64.whl (639.3 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

bocpy-0.14.0-cp312-cp312-manylinux_2_28_x86_64.whl (652.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

bocpy-0.14.0-cp312-cp312-macosx_14_0_x86_64.whl (249.0 kB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

bocpy-0.14.0-cp312-cp312-macosx_11_0_arm64.whl (237.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

bocpy-0.14.0-cp311-cp311-win_amd64.whl (229.6 kB view details)

Uploaded CPython 3.11Windows x86-64

bocpy-0.14.0-cp311-cp311-win32.whl (220.1 kB view details)

Uploaded CPython 3.11Windows x86

bocpy-0.14.0-cp311-cp311-musllinux_1_2_x86_64.whl (634.1 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

bocpy-0.14.0-cp311-cp311-manylinux_2_28_x86_64.whl (643.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

bocpy-0.14.0-cp311-cp311-macosx_14_0_x86_64.whl (248.6 kB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

bocpy-0.14.0-cp311-cp311-macosx_11_0_arm64.whl (237.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

bocpy-0.14.0-cp310-cp310-win_amd64.whl (229.7 kB view details)

Uploaded CPython 3.10Windows x86-64

bocpy-0.14.0-cp310-cp310-win32.whl (220.0 kB view details)

Uploaded CPython 3.10Windows x86

bocpy-0.14.0-cp310-cp310-musllinux_1_2_x86_64.whl (624.4 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

bocpy-0.14.0-cp310-cp310-manylinux_2_28_x86_64.whl (632.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

bocpy-0.14.0-cp310-cp310-macosx_14_0_x86_64.whl (248.8 kB view details)

Uploaded CPython 3.10macOS 14.0+ x86-64

bocpy-0.14.0-cp310-cp310-macosx_11_0_arm64.whl (235.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for bocpy-0.14.0.tar.gz
Algorithm Hash digest
SHA256 93d47bee55ae620dc884f3d85cafc384627b0527ab76faf553927a13ef7aa8fb
MD5 4629a5d08775dc521989183eee5d4383
BLAKE2b-256 d2c793212a41967e7dc4d3d66db664ef2988427a24da2966d293ed2fe4a1ec03

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.14.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 232.6 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.14.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 e73b8ce8e0894e8020690106a09c5c1be65a9b0f267ab25154bf08310c442ffb
MD5 11d6d4b23f51f7f6b723fa755529b4a2
BLAKE2b-256 b75145dc17eb00880b7f9a15093c30b0c150c9da3d91fab66bd135100837cc7b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.14.0-cp314-cp314-win32.whl
  • Upload date:
  • Size: 223.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.14.0-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 8bc103f05d5123b690eda0037d3accffaea78870107239efe41edea48d30f165
MD5 45ae182c3c0be1580f398963d521294c
BLAKE2b-256 22c266a2189caacff594a12cb1c539dae301c01f3b69b891af99321c7bb5ed11

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4f8d4d01236fdca116d1522e1cc79bc2ae7e9bbea6cbbe6b72badca441d4ff21
MD5 2fe4d6fee3c8c166f5d7abef228d2713
BLAKE2b-256 b9ad595973a30f3f01a83625e5fc5577a7fbd1214612a0c831dce046fd6c47cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8509599ed7f97a887c513bba0ba2b704365119ad0231759e771914a7ebb90623
MD5 61e9bac2e7d735acbdc47ce15f7a64b6
BLAKE2b-256 d920bb31f0ff11f43021684722268f6add03045bb41f65dde27716607592e946

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 5bf66656de7a6797e3bcc6df6efdf08601df29ffee36e9a8d2e637ecc080c654
MD5 1967bcf6f0a3645bba921dc22abe0eb0
BLAKE2b-256 5286e429322ae77036ee70e82c6124d5b1b7d568703b03e995ba08175896362a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 03cf2e31cd099547c97d19b4a8d136d3339192ad9569a9a7896f54d36fce8509
MD5 e8069966ab793aecc81424aa6cee24ad
BLAKE2b-256 76c29c8cb1e7fb1a4c579eae90c76bf18cb73a4392cc6b21f4fe059846967b7e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.14.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 229.7 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.14.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f77639a20a9aed93e636f76793aef6d814ae98db0c90b21f737a42c34a022edd
MD5 125e59ba1e52e359f52e0f379961d825
BLAKE2b-256 566f6a7eddd490e182ed1d7b5fa3f862cc49646125146a943e5ba6489d91e292

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.14.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 220.3 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.14.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 2f180d722ed8cdd34fba7f625570d7cebc34d9a6cf24e0eee618be80adc1422c
MD5 662a6a810dea5f2523b91197f6b8c410
BLAKE2b-256 b300ea3d9cf19dcafa113ae55c0ab1e511be4d0cfb019a67af5f1a458cdbbda4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d26daa8b37bb3de06ad632d727f47e40d6aaaeccc477262cfc26beb707724297
MD5 5f83a7f9e94fb4730f7fb4f802cada10
BLAKE2b-256 3428649579d065c670f2dfa147981dfdeb9b44cd718fe8fd2b635688e55fddbf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5efb0a176dc08b0110954c92a47f47b1fb3f215a3909c3dc6b788d6a71661d6e
MD5 5eab2e30bc9be705e7a045daef9c7d40
BLAKE2b-256 f420d622adfba0b4ad93a16428b83e4c467e098b3fc6aa5bf2afc7176f3ffca5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 4dcf3544dee73155e0a9822237aaef5979a24fcc685ad24f7c58fe3f8c052cf5
MD5 5772f4d9e8dd5392692cb73acfb766a7
BLAKE2b-256 388c613c5ea064095a0fa910425bb88175ac13048cde900a7df6e7885515e987

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a0aeaba52e80ceb6e3e01b87d95665f8620d969f4d4d4094cfea5ccfa0b42e50
MD5 b39dba8c5c95960244b2acff53ec3dc4
BLAKE2b-256 225db94a0ab9da950f7109354c8a6a74707e26a4ba4b28f2efea87ac26a5816f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.14.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 229.8 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.14.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 679a36da5a9803feb916d9c7ee3a0540b652848e65e14cf997eb69b9874033bf
MD5 d72342c94ee51a10ccfbdf7d5f190322
BLAKE2b-256 0c6a710632151ff6ecd372db50a241867f472e047a77bb27028f40d1d612207e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.14.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 220.4 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.14.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 19b82413150d6962c8f2c740f9f98c2ea5b573fdf4eb60c09e28f533117b7d18
MD5 83857b6570f809035b88fa390cf8e2b0
BLAKE2b-256 f923896534963999a23cfb010f96f02265e1fac30c3db6228b89f2e63435de14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 46ab550c36c9689be886a71f2d3e14bbecb7ebc75c205b79017f539e0fbb96f1
MD5 a31defc363f6587fe4f75c9591ca3a57
BLAKE2b-256 4dbc4e245d5d0f93b0125e4930203563033fcb80b3bad3d593fd438a362610fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d0c7d9da13599ee0a1898ff2d614ad4252fef32dd4800ef3f7feff25d74efce0
MD5 9ff0adf57d39ae15e69230d76d8c628d
BLAKE2b-256 eab98ebddf0ed7afedd88c9117f2980dfeee106863d1d1e76783153ce39411d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 ddfb436eca19c19cb606bdc4e6181bba4be076ab87c623d4fdd80f6fd6833600
MD5 78f6e1766b8d820ba7d1c50d6d252b38
BLAKE2b-256 6fa8338a04b08c9c5f90eaafb5eff75013f1729ed1410f458c389fe7595c561d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9a00dba25de21dba6b535a810e8b25701067bb1c19fcc65164da6b29d8276d9f
MD5 c237dd7833687586176685de46e2c37f
BLAKE2b-256 31e0563458557b8d8e46a3799aee8e828db6d8f995feb47e7b00878d78462afa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.14.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 229.6 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.14.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3b87714006a86d76d807e23d49c310412114915dd6a7b817ab34930e0b41310e
MD5 f0e971ff480746a8308a78a6cf620900
BLAKE2b-256 fd3e1241ce24ab1c1bd085d7dd124424222d85837946b7a23eadb9a0701d7538

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.14.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 220.1 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.14.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 71781d0553d61cb33e95b988003a5c4cbf8511729ed74647ff0127398897f0e3
MD5 708cd0f7f2efa9de758744a60312a711
BLAKE2b-256 b9041b96cd4be421698e0aff2749d59101a9d711a156f735f6aca0db9b2f10e7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f03e7d0b72b4f8816d509ec25738d3308d76c7d625a6c3b5bd4989afb168ad06
MD5 40e45af213a9c57541d19fd0d42bbf79
BLAKE2b-256 9dbb28aaf3e00102bfe34fbff8f784c74858ed359769c7251c52fffb48c1bcb5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8e78e6811c6de02df49383fdb49878a999d8ad15f7d91e48456312668d2a1e41
MD5 aef83b68f2b40f8723f7684473492795
BLAKE2b-256 76d3694ebf1b758b346233b93dd9181e97ad7ba8220a83cdfdbaaf742bc7ebf6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 1bf0e70f4f00f64832589a73760ebb7d5b79044d1655c07d5f60a9f9c2d49a55
MD5 4264e8c77a5b0d58d9c04acfa628643a
BLAKE2b-256 fb5b9054cd57e1ca32b1baefc84b9694d5b05cf5e4cb26f68a429aac979caf3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c31d43d0ecfcbd7bb219d89c5573abb8f76f56bbdc9f4f6d14c0f1ad6817e44a
MD5 d48f01a8832008a9bfc0d3d7c702524f
BLAKE2b-256 6fadd2d8002562149eb4945413e21ec8bc3568b3cea75a1dd30a1fa05ae75424

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.14.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 229.7 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.14.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 509a15aa1bd3b651151127d8c46ceb68b23e1a0e93f3dfe67dc4ad4a0b796345
MD5 a20ef7a638c25ff8feb5e18302fe935c
BLAKE2b-256 7deeb8224360bbd74b903865da45369f0321d2a6d6357d2d261700ea9d032a73

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.14.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 220.0 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.14.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 e1e1ba3f20861ff648cfc94b03368a7e3b2f0e8c5da2c996811ef8ea3de1019a
MD5 2de8122d8ca3c75729bd1a9fd64e7390
BLAKE2b-256 0cd7c9a405f1efeb214a68095537f4c09d03da24ad8bad40371610813741505e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e5508bc227dc021e89067855adecba14806e04d62c213cdfd04ff7dd16ead748
MD5 d5810e13f86a577b0036dd21ffe0a583
BLAKE2b-256 459ab4499a76695f231242f06e1a9b643e533ae590249fdcc5c7a8b6b8822a08

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 52b339336deb3304995cca290ca49de3e0b2f6b098e54e98c43e72f60553f898
MD5 90a2aa204b4acb972ace1cfe05cc4d95
BLAKE2b-256 5b88c4af1c8e59da341b928c22a2269afea6de4ac3b476a318179b7bc741af98

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp310-cp310-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 d1d6de6efd9cd9de77656bb1c9ee51a808b1b2d908468388ea3ad4a3064e7097
MD5 f73248c72ccb5d88a836e8728dcf1b80
BLAKE2b-256 50c791b19fd2526fe18f4b16374e1640bcf8809a0cfff72c0fc50e7e84d34877

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.14.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f57b810b3c3303881d602acc41a00a9997f7344f996666603f982cbdddfc58fb
MD5 02d9c325ea7722c138edb351bbf70296
BLAKE2b-256 919a31e965a36f604486a5fd14d50ce651cfdb8076f56b8ead39798a572de407

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