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.12.0.tar.gz (383.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.12.0-cp314-cp314-win_amd64.whl (204.8 kB view details)

Uploaded CPython 3.14Windows x86-64

bocpy-0.12.0-cp314-cp314-win32.whl (199.3 kB view details)

Uploaded CPython 3.14Windows x86

bocpy-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl (540.9 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

bocpy-0.12.0-cp314-cp314-manylinux_2_28_x86_64.whl (552.1 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

bocpy-0.12.0-cp314-cp314-macosx_14_0_x86_64.whl (216.5 kB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

bocpy-0.12.0-cp314-cp314-macosx_11_0_arm64.whl (207.5 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

bocpy-0.12.0-cp313-cp313-win_amd64.whl (202.3 kB view details)

Uploaded CPython 3.13Windows x86-64

bocpy-0.12.0-cp313-cp313-win32.whl (196.6 kB view details)

Uploaded CPython 3.13Windows x86

bocpy-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl (540.1 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

bocpy-0.12.0-cp313-cp313-manylinux_2_28_x86_64.whl (551.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

bocpy-0.12.0-cp313-cp313-macosx_14_0_x86_64.whl (216.3 kB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

bocpy-0.12.0-cp313-cp313-macosx_11_0_arm64.whl (207.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

bocpy-0.12.0-cp312-cp312-win_amd64.whl (202.4 kB view details)

Uploaded CPython 3.12Windows x86-64

bocpy-0.12.0-cp312-cp312-win32.whl (196.7 kB view details)

Uploaded CPython 3.12Windows x86

bocpy-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl (542.2 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

bocpy-0.12.0-cp312-cp312-manylinux_2_28_x86_64.whl (553.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

bocpy-0.12.0-cp312-cp312-macosx_14_0_x86_64.whl (216.6 kB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

bocpy-0.12.0-cp312-cp312-macosx_11_0_arm64.whl (207.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

bocpy-0.12.0-cp311-cp311-win_amd64.whl (202.3 kB view details)

Uploaded CPython 3.11Windows x86-64

bocpy-0.12.0-cp311-cp311-win32.whl (196.5 kB view details)

Uploaded CPython 3.11Windows x86

bocpy-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl (536.7 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

bocpy-0.12.0-cp311-cp311-manylinux_2_28_x86_64.whl (546.2 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

bocpy-0.12.0-cp311-cp311-macosx_14_0_x86_64.whl (216.4 kB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

bocpy-0.12.0-cp311-cp311-macosx_11_0_arm64.whl (207.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

bocpy-0.12.0-cp310-cp310-win_amd64.whl (202.4 kB view details)

Uploaded CPython 3.10Windows x86-64

bocpy-0.12.0-cp310-cp310-win32.whl (196.4 kB view details)

Uploaded CPython 3.10Windows x86

bocpy-0.12.0-cp310-cp310-musllinux_1_2_x86_64.whl (527.3 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

bocpy-0.12.0-cp310-cp310-manylinux_2_28_x86_64.whl (536.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

bocpy-0.12.0-cp310-cp310-macosx_14_0_x86_64.whl (216.6 kB view details)

Uploaded CPython 3.10macOS 14.0+ x86-64

bocpy-0.12.0-cp310-cp310-macosx_11_0_arm64.whl (208.0 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: bocpy-0.12.0.tar.gz
  • Upload date:
  • Size: 383.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.12.0.tar.gz
Algorithm Hash digest
SHA256 2bdf758e610b75baddd223cbdb7e6df230de88256269d204be889358cdc52efc
MD5 2f3138f91b0ea9413b13e16488b580f0
BLAKE2b-256 5cf525732bad3c3c9bf43c7d104df0e936fb2db4851a93919caa831af639b128

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.12.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 204.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.12.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 6714d743978b17367a522ef1b9a17490b8b36675fc3c37e93680d25de595c8dc
MD5 11f77d8f742386931a7061fcbb28c1f1
BLAKE2b-256 695687cb63c7fdc26a0880b94ad06d6a53df891ea4637f12b6103490553a2327

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.12.0-cp314-cp314-win32.whl
  • Upload date:
  • Size: 199.3 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.12.0-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 2b0dcd98f647b1729edd3e12b1701202af73baf3b64fdc773ed8d45758770c38
MD5 6491064876ca9d7f4b2b61a5c36f129c
BLAKE2b-256 532e8fa5dab32666d5b07c4a1e014e7fc42e7480ec2068717bba06ff543a4e82

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bd2dbd502cf0f315a5cef5d10b983ce68df2408bd2d7e0811c988eda9547bf9e
MD5 7ae96fe681ae8d4788bbed28a4c6b2dc
BLAKE2b-256 98b03e82e6d3607182baca84750b8aaba6fef1965fbaf4617b90473098f6e4bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 dfcc89e85cd09dcedaeb985b7d075398d5145eacb9e016366b5179078346f32b
MD5 7f7e1269755a0d4514f47c890adaa709
BLAKE2b-256 c9096968fd1c470b9f4f8d50c5711d87fa7f81838b202a0cd3882a180733ea37

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 3892d000b5323b44fde2b1b962cebc49696806893eb9837b14cf86de9c993f07
MD5 14a6195948904be157d6e00771ac9b0e
BLAKE2b-256 c330aa875b0a10e841fd855cb5d7f6e61cf7784f4f61e2c2187e32f2939dd7bd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 05d15f784192a834a996a8a5cf247c2fcdc3a18397522d019c8b39b6270ee489
MD5 968c5d438e3dd3b01ddb5b0a7dcdccae
BLAKE2b-256 517552476cba6a7c0c3be7bdfa790e55c195c11cff448393db5f419c8b71a9bb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.12.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 202.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.12.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 625fa33b9013d6a1f2cc4899a932997cda967ce0803a3c38b2b09702f8e176b7
MD5 e902ed779b4ad519b9480a523e87cd8f
BLAKE2b-256 8d444971fdf6c821046da8939d3da75d6eafb638471178fb1775884a461d74d5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.12.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 196.6 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.12.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 d0ddfd79e873bdfe58053bd869a461e6cdad1b375e93f820d1264280e2fb7d7a
MD5 61ede0169df8d74f3e332785f1c09334
BLAKE2b-256 3a9cb4645d97668cad92793881079271adecc07c78b04b0a893b8eff31a14608

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 143a201df51c644636fed2cd54cb04a2f178b5638bf3e51235c57c0aeffac01e
MD5 e4df5412fe9a03e66df39daafa7f9fb9
BLAKE2b-256 323750d5bff5e0c0e95a8ff277d263c5bf5bfed8c8760930ba49e5c484b59709

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f870c6a356be63ac0a919987c8090968b91466e83b49e7179d62a0718255513a
MD5 312e1109d1c806f4c9d488c34ed789f7
BLAKE2b-256 2b8c2614d34e8bef60cf291b3666b7f4b1101905f274abfc5c783ccee507ee81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 6cadcbab67d9b721da18a78c68911bb6c64e9049ed9c6333d789bc3e2d2e9a63
MD5 afcebb6c5d6f608de18ca0990f560867
BLAKE2b-256 13f776d7d57cb75d52966b0c300d24999a9ffb1b6adfb8d32eb2fce11f18b2d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2b56435a074ee9902985bf48a9aada497a89a59b83550113d618fc944653b90b
MD5 9abe43eab21513702fc43fddcbd306b5
BLAKE2b-256 097fae37197f21f62fc4b5c7b4e14618d81e92092c42229ff7161ca7d26394ef

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.12.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 202.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.12.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ab9bfcc2fb60975a0ed77b8d777ee27bce902fc24bb063c4ca8edf466ba601c3
MD5 604308a6f1c005da79ff15e2541ba617
BLAKE2b-256 a236d9f50c4c9d378c0341c2f614210cd19de7438619518b1eaff913390411e6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.12.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 196.7 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.12.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 3ee965673d8db029a7e1b7145d0c207503e30ae553fcb30bb59f934a926ae556
MD5 5817c8f03df3cdb790bebdf8e133e149
BLAKE2b-256 8ba591e1a1fa2d827dfdf43b31a83a26f461ec2736ade9a05cacf975063d0dee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 431e7a5e7d51f1c4da205f72c7139965630205427c88a623155466f1155366b6
MD5 1124da20dba50063e39c746deaff0666
BLAKE2b-256 74d2250ef4fe42984306b9c8bab8e145efda2a1d4e10f231241f198281e46602

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e0a9b0359347ccb1fdf7b38490705d8019f6645e2e9b6b7196fbb8b46b0a21db
MD5 bcf972b690342e031280af213e2006a5
BLAKE2b-256 a28d50ec99e771bdc1f04c23622aefb86e31f6295c983ce8d05b3ec4c686baf3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 4565dfb187b97839390f15aadb2687faf26559b83753b7f4e22025847e8666ee
MD5 547861a6ba83c0bb9353270d79c482d1
BLAKE2b-256 0694b95256605829ce86bcfbeac822d09be11fe861c564e0ff615736f763234a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 64f806c89003df55d0afb7ec708209b12bf3203d584f8cd9ad28b28775f44c98
MD5 2db8a589303c6f80ae00f2603d8b2815
BLAKE2b-256 b26e4ad99fed1cba7da5cd5f6741e7591ef3400d07930b004e00fbd93134f13e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.12.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 202.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.12.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c9cf7a8da0a9d5d675600d949722d9d153f6761fa00a4de59db34196c067ef2e
MD5 316d3a290f5017f7c1388628a7465a7f
BLAKE2b-256 cd5d7fa767695dd50c02cf1165574d282d22fb1e22e50e042b7200bdc060054e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.12.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 196.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.12.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 1bfceeba2f754926cfb9726a91f640e9e1d9cb6771b2f851d5cf059eb53bc3ac
MD5 98a79b4245c5cd3350ce0921134cc8d2
BLAKE2b-256 64c186901e6bbf78ef04fe3a373ce2daf1fb5f3d5f99683d529c13f6ee14e781

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 541c6ef219ea22d825bd968e94636a407c5a17a05a654396a0e223bd3e667f46
MD5 f18e2244394a4b8a3086d0e1a127af1d
BLAKE2b-256 e9d780a769b7ee04ce575587495de716457980b822b60e839b68a93e31a80600

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a9a694ca9d5294044f908ebbb2d1387040fe1804d424824c8d3d89bfad0cb215
MD5 8a4191b35b99e78e69da291510484d34
BLAKE2b-256 bc5cd1436d4d1238d3f6a140d674b77fc91a41225af742e706328523ce55f2b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 c4e42c1416c74a6c231e4f52ba68a0d6e4832c7e6269b49cee9d798fc83702b4
MD5 ad7e46835fe3e0eca97e7c43c0704ae2
BLAKE2b-256 73345f73780e274205545f4b01514048b3ecb60edab21dd32e3fa8066f4f17a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8743c0c9e1a49ae42482f4ebc211b8a31f035707e542d8f700d38f8b06fc5526
MD5 2eca5de0cede8499323e30850c4785dd
BLAKE2b-256 246bbf051d3f3ca2a834f2531c11674827c450fa97bf9ffbf42eec8d22410ca9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.12.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 202.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.12.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 eec377f40131716529368744b7297c81963231c38e5de603e04e103f03d95e99
MD5 133854b4119746de0af3092d63c5b84f
BLAKE2b-256 fe4be84415ffb2ef2d09c55075e6155d976f60c363a19573b12d521b41fb2004

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.12.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 196.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.12.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 ac8d3eb5306755b30297e114e16d4fe86385e8526bc64d2c904b1b4434f979d0
MD5 b44006727345d7b8243b29425e718860
BLAKE2b-256 6bc3fd3004f90b5c35ca7af9481ce6bedda202ebd845cea2367fee045a72ef1d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2a290e28e088743ceeb30cdb7ff51bfeb37abc0977c9c731a33458ce138de4db
MD5 db122c364953d97b9bb67da955c7a963
BLAKE2b-256 47fd345b4fc34853a143fff774affa0db2649351a2da0817daff0c1b12fe5667

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1f1da6f18d0e4e82056bc41755e7a1eb92f1c6b237d28fde1846fad9aed93b90
MD5 5546549b1d34a4aebad39432125a92be
BLAKE2b-256 40504b17085268cd0c551f0012e75e921b13ee4af1af424d7b601342bec9c813

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp310-cp310-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 54bbbcb2e9c73df7e859514fcad4bf23d4878356e051a5d851b113959e9b70a8
MD5 ba22cb1877b4c4b70e6d967030d09330
BLAKE2b-256 3c6838ab61ffdd20c89f96a25289aaf9677043917e661ac56c09963fc7ce041f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.12.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 15d4cfe48f5c268b6a7e3f404bffedd2c238348bc24965b810ba21c40884e0cd
MD5 5242e03ba98c262ec7895132dcc3e29f
BLAKE2b-256 1f7f7fac9b91a5263371de2d3417ec466f22b1aee8decbc6e158bd1cdc7059cd

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