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.

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.

Metadata

Release files for bocpy 0.14.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for bocpy 0.14.0
File Size Uploaded
bocpy-0.14.0.tar.gz 445.8 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for bocpy 0.14.0
File
bocpy-0.14.0-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
bocpy-0.14.0-cp314-cp314-win32.whl CPython 3.14 CPython 3.14 Windows x86-32 Details
bocpy-0.14.0-cp314-cp314-musllinux_1_2_x86_64.whl CPython 3.14 CPython 3.14 Linux musl 1.2+ x86-64 Details
bocpy-0.14.0-cp314-cp314-manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64 Details
bocpy-0.14.0-cp314-cp314-macosx_14_0_x86_64.whl CPython 3.14 CPython 3.14 macOS 14.0+ x86-64 Details
bocpy-0.14.0-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
bocpy-0.14.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
bocpy-0.14.0-cp313-cp313-win32.whl CPython 3.13 CPython 3.13 Windows x86-32 Details
bocpy-0.14.0-cp313-cp313-musllinux_1_2_x86_64.whl CPython 3.13 CPython 3.13 Linux musl 1.2+ x86-64 Details
bocpy-0.14.0-cp313-cp313-manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64 Details
bocpy-0.14.0-cp313-cp313-macosx_14_0_x86_64.whl CPython 3.13 CPython 3.13 macOS 14.0+ x86-64 Details
bocpy-0.14.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
bocpy-0.14.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
bocpy-0.14.0-cp312-cp312-win32.whl CPython 3.12 CPython 3.12 Windows x86-32 Details
bocpy-0.14.0-cp312-cp312-musllinux_1_2_x86_64.whl CPython 3.12 CPython 3.12 Linux musl 1.2+ x86-64 Details
bocpy-0.14.0-cp312-cp312-manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64 Details
bocpy-0.14.0-cp312-cp312-macosx_14_0_x86_64.whl CPython 3.12 CPython 3.12 macOS 14.0+ x86-64 Details
bocpy-0.14.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
bocpy-0.14.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
bocpy-0.14.0-cp311-cp311-win32.whl CPython 3.11 CPython 3.11 Windows x86-32 Details
bocpy-0.14.0-cp311-cp311-musllinux_1_2_x86_64.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ x86-64 Details
bocpy-0.14.0-cp311-cp311-manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64 Details
bocpy-0.14.0-cp311-cp311-macosx_14_0_x86_64.whl CPython 3.11 CPython 3.11 macOS 14.0+ x86-64 Details
bocpy-0.14.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
bocpy-0.14.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
bocpy-0.14.0-cp310-cp310-win32.whl CPython 3.10 CPython 3.10 Windows x86-32 Details
bocpy-0.14.0-cp310-cp310-musllinux_1_2_x86_64.whl CPython 3.10 CPython 3.10 Linux musl 1.2+ x86-64 Details
bocpy-0.14.0-cp310-cp310-manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64 Details
bocpy-0.14.0-cp310-cp310-macosx_14_0_x86_64.whl CPython 3.10 CPython 3.10 macOS 14.0+ x86-64 Details
bocpy-0.14.0-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details

Total release size: 11.5 MB

Release files / bocpy-0.14.0.tar.gz

Download URL bocpy-0.14.0.tar.gz
Size 445.8 kB
Tags Source
SHA-256 checksum
How to use checksums
93d47bee55ae620dc884f3d85cafc384627b0527ab76faf553927a13ef7aa8fb
BLAKE2b-256 checksum
How to use checksums
d2c793212a41967e7dc4d3d66db664ef2988427a24da2966d293ed2fe4a1ec03
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp314-cp314-win_amd64.whl

Download URL bocpy-0.14.0-cp314-cp314-win_amd64.whl
Size 232.6 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
e73b8ce8e0894e8020690106a09c5c1be65a9b0f267ab25154bf08310c442ffb
BLAKE2b-256 checksum
How to use checksums
b75145dc17eb00880b7f9a15093c30b0c150c9da3d91fab66bd135100837cc7b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp314-cp314-win32.whl

Download URL bocpy-0.14.0-cp314-cp314-win32.whl
Size 223.6 kB
Tags CPython 3.14 Windows x86-32
SHA-256 checksum
How to use checksums
8bc103f05d5123b690eda0037d3accffaea78870107239efe41edea48d30f165
BLAKE2b-256 checksum
How to use checksums
22c266a2189caacff594a12cb1c539dae301c01f3b69b891af99321c7bb5ed11
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp314-cp314-musllinux_1_2_x86_64.whl

Download URL bocpy-0.14.0-cp314-cp314-musllinux_1_2_x86_64.whl
Size 638.0 kB
Tags CPython 3.14 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
4f8d4d01236fdca116d1522e1cc79bc2ae7e9bbea6cbbe6b72badca441d4ff21
BLAKE2b-256 checksum
How to use checksums
b9ad595973a30f3f01a83625e5fc5577a7fbd1214612a0c831dce046fd6c47cd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp314-cp314-manylinux_2_28_x86_64.whl

Download URL bocpy-0.14.0-cp314-cp314-manylinux_2_28_x86_64.whl
Size 650.5 kB
Tags CPython 3.14 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
8509599ed7f97a887c513bba0ba2b704365119ad0231759e771914a7ebb90623
BLAKE2b-256 checksum
How to use checksums
d920bb31f0ff11f43021684722268f6add03045bb41f65dde27716607592e946
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp314-cp314-macosx_14_0_x86_64.whl

Download URL bocpy-0.14.0-cp314-cp314-macosx_14_0_x86_64.whl
Size 248.7 kB
Tags CPython 3.14 macOS 14.0+ x86-64
SHA-256 checksum
How to use checksums
5bf66656de7a6797e3bcc6df6efdf08601df29ffee36e9a8d2e637ecc080c654
BLAKE2b-256 checksum
How to use checksums
5286e429322ae77036ee70e82c6124d5b1b7d568703b03e995ba08175896362a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp314-cp314-macosx_11_0_arm64.whl

Download URL bocpy-0.14.0-cp314-cp314-macosx_11_0_arm64.whl
Size 237.1 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
03cf2e31cd099547c97d19b4a8d136d3339192ad9569a9a7896f54d36fce8509
BLAKE2b-256 checksum
How to use checksums
76c29c8cb1e7fb1a4c579eae90c76bf18cb73a4392cc6b21f4fe059846967b7e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp313-cp313-win_amd64.whl

Download URL bocpy-0.14.0-cp313-cp313-win_amd64.whl
Size 229.7 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
f77639a20a9aed93e636f76793aef6d814ae98db0c90b21f737a42c34a022edd
BLAKE2b-256 checksum
How to use checksums
566f6a7eddd490e182ed1d7b5fa3f862cc49646125146a943e5ba6489d91e292
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp313-cp313-win32.whl

Download URL bocpy-0.14.0-cp313-cp313-win32.whl
Size 220.3 kB
Tags CPython 3.13 Windows x86-32
SHA-256 checksum
How to use checksums
2f180d722ed8cdd34fba7f625570d7cebc34d9a6cf24e0eee618be80adc1422c
BLAKE2b-256 checksum
How to use checksums
b300ea3d9cf19dcafa113ae55c0ab1e511be4d0cfb019a67af5f1a458cdbbda4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp313-cp313-musllinux_1_2_x86_64.whl

Download URL bocpy-0.14.0-cp313-cp313-musllinux_1_2_x86_64.whl
Size 637.1 kB
Tags CPython 3.13 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
d26daa8b37bb3de06ad632d727f47e40d6aaaeccc477262cfc26beb707724297
BLAKE2b-256 checksum
How to use checksums
3428649579d065c670f2dfa147981dfdeb9b44cd718fe8fd2b635688e55fddbf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp313-cp313-manylinux_2_28_x86_64.whl

Download URL bocpy-0.14.0-cp313-cp313-manylinux_2_28_x86_64.whl
Size 649.6 kB
Tags CPython 3.13 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
5efb0a176dc08b0110954c92a47f47b1fb3f215a3909c3dc6b788d6a71661d6e
BLAKE2b-256 checksum
How to use checksums
f420d622adfba0b4ad93a16428b83e4c467e098b3fc6aa5bf2afc7176f3ffca5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp313-cp313-macosx_14_0_x86_64.whl

Download URL bocpy-0.14.0-cp313-cp313-macosx_14_0_x86_64.whl
Size 248.7 kB
Tags CPython 3.13 macOS 14.0+ x86-64
SHA-256 checksum
How to use checksums
4dcf3544dee73155e0a9822237aaef5979a24fcc685ad24f7c58fe3f8c052cf5
BLAKE2b-256 checksum
How to use checksums
388c613c5ea064095a0fa910425bb88175ac13048cde900a7df6e7885515e987
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL bocpy-0.14.0-cp313-cp313-macosx_11_0_arm64.whl
Size 236.9 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a0aeaba52e80ceb6e3e01b87d95665f8620d969f4d4d4094cfea5ccfa0b42e50
BLAKE2b-256 checksum
How to use checksums
225db94a0ab9da950f7109354c8a6a74707e26a4ba4b28f2efea87ac26a5816f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp312-cp312-win_amd64.whl

Download URL bocpy-0.14.0-cp312-cp312-win_amd64.whl
Size 229.8 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
679a36da5a9803feb916d9c7ee3a0540b652848e65e14cf997eb69b9874033bf
BLAKE2b-256 checksum
How to use checksums
0c6a710632151ff6ecd372db50a241867f472e047a77bb27028f40d1d612207e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp312-cp312-win32.whl

Download URL bocpy-0.14.0-cp312-cp312-win32.whl
Size 220.4 kB
Tags CPython 3.12 Windows x86-32
SHA-256 checksum
How to use checksums
19b82413150d6962c8f2c740f9f98c2ea5b573fdf4eb60c09e28f533117b7d18
BLAKE2b-256 checksum
How to use checksums
f923896534963999a23cfb010f96f02265e1fac30c3db6228b89f2e63435de14
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp312-cp312-musllinux_1_2_x86_64.whl

Download URL bocpy-0.14.0-cp312-cp312-musllinux_1_2_x86_64.whl
Size 639.3 kB
Tags CPython 3.12 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
46ab550c36c9689be886a71f2d3e14bbecb7ebc75c205b79017f539e0fbb96f1
BLAKE2b-256 checksum
How to use checksums
4dbc4e245d5d0f93b0125e4930203563033fcb80b3bad3d593fd438a362610fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp312-cp312-manylinux_2_28_x86_64.whl

Download URL bocpy-0.14.0-cp312-cp312-manylinux_2_28_x86_64.whl
Size 652.0 kB
Tags CPython 3.12 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
d0c7d9da13599ee0a1898ff2d614ad4252fef32dd4800ef3f7feff25d74efce0
BLAKE2b-256 checksum
How to use checksums
eab98ebddf0ed7afedd88c9117f2980dfeee106863d1d1e76783153ce39411d7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp312-cp312-macosx_14_0_x86_64.whl

Download URL bocpy-0.14.0-cp312-cp312-macosx_14_0_x86_64.whl
Size 249.0 kB
Tags CPython 3.12 macOS 14.0+ x86-64
SHA-256 checksum
How to use checksums
ddfb436eca19c19cb606bdc4e6181bba4be076ab87c623d4fdd80f6fd6833600
BLAKE2b-256 checksum
How to use checksums
6fa8338a04b08c9c5f90eaafb5eff75013f1729ed1410f458c389fe7595c561d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp312-cp312-macosx_11_0_arm64.whl

Download URL bocpy-0.14.0-cp312-cp312-macosx_11_0_arm64.whl
Size 237.3 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
9a00dba25de21dba6b535a810e8b25701067bb1c19fcc65164da6b29d8276d9f
BLAKE2b-256 checksum
How to use checksums
31e0563458557b8d8e46a3799aee8e828db6d8f995feb47e7b00878d78462afa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp311-cp311-win_amd64.whl

Download URL bocpy-0.14.0-cp311-cp311-win_amd64.whl
Size 229.6 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
3b87714006a86d76d807e23d49c310412114915dd6a7b817ab34930e0b41310e
BLAKE2b-256 checksum
How to use checksums
fd3e1241ce24ab1c1bd085d7dd124424222d85837946b7a23eadb9a0701d7538
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp311-cp311-win32.whl

Download URL bocpy-0.14.0-cp311-cp311-win32.whl
Size 220.1 kB
Tags CPython 3.11 Windows x86-32
SHA-256 checksum
How to use checksums
71781d0553d61cb33e95b988003a5c4cbf8511729ed74647ff0127398897f0e3
BLAKE2b-256 checksum
How to use checksums
b9041b96cd4be421698e0aff2749d59101a9d711a156f735f6aca0db9b2f10e7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp311-cp311-musllinux_1_2_x86_64.whl

Download URL bocpy-0.14.0-cp311-cp311-musllinux_1_2_x86_64.whl
Size 634.1 kB
Tags CPython 3.11 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
f03e7d0b72b4f8816d509ec25738d3308d76c7d625a6c3b5bd4989afb168ad06
BLAKE2b-256 checksum
How to use checksums
9dbb28aaf3e00102bfe34fbff8f784c74858ed359769c7251c52fffb48c1bcb5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp311-cp311-manylinux_2_28_x86_64.whl

Download URL bocpy-0.14.0-cp311-cp311-manylinux_2_28_x86_64.whl
Size 643.3 kB
Tags CPython 3.11 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
8e78e6811c6de02df49383fdb49878a999d8ad15f7d91e48456312668d2a1e41
BLAKE2b-256 checksum
How to use checksums
76d3694ebf1b758b346233b93dd9181e97ad7ba8220a83cdfdbaaf742bc7ebf6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp311-cp311-macosx_14_0_x86_64.whl

Download URL bocpy-0.14.0-cp311-cp311-macosx_14_0_x86_64.whl
Size 248.6 kB
Tags CPython 3.11 macOS 14.0+ x86-64
SHA-256 checksum
How to use checksums
1bf0e70f4f00f64832589a73760ebb7d5b79044d1655c07d5f60a9f9c2d49a55
BLAKE2b-256 checksum
How to use checksums
fb5b9054cd57e1ca32b1baefc84b9694d5b05cf5e4cb26f68a429aac979caf3e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL bocpy-0.14.0-cp311-cp311-macosx_11_0_arm64.whl
Size 237.0 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c31d43d0ecfcbd7bb219d89c5573abb8f76f56bbdc9f4f6d14c0f1ad6817e44a
BLAKE2b-256 checksum
How to use checksums
6fadd2d8002562149eb4945413e21ec8bc3568b3cea75a1dd30a1fa05ae75424
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp310-cp310-win_amd64.whl

Download URL bocpy-0.14.0-cp310-cp310-win_amd64.whl
Size 229.7 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
509a15aa1bd3b651151127d8c46ceb68b23e1a0e93f3dfe67dc4ad4a0b796345
BLAKE2b-256 checksum
How to use checksums
7deeb8224360bbd74b903865da45369f0321d2a6d6357d2d261700ea9d032a73
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp310-cp310-win32.whl

Download URL bocpy-0.14.0-cp310-cp310-win32.whl
Size 220.0 kB
Tags CPython 3.10 Windows x86-32
SHA-256 checksum
How to use checksums
e1e1ba3f20861ff648cfc94b03368a7e3b2f0e8c5da2c996811ef8ea3de1019a
BLAKE2b-256 checksum
How to use checksums
0cd7c9a405f1efeb214a68095537f4c09d03da24ad8bad40371610813741505e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp310-cp310-musllinux_1_2_x86_64.whl

Download URL bocpy-0.14.0-cp310-cp310-musllinux_1_2_x86_64.whl
Size 624.4 kB
Tags CPython 3.10 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
e5508bc227dc021e89067855adecba14806e04d62c213cdfd04ff7dd16ead748
BLAKE2b-256 checksum
How to use checksums
459ab4499a76695f231242f06e1a9b643e533ae590249fdcc5c7a8b6b8822a08
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp310-cp310-manylinux_2_28_x86_64.whl

Download URL bocpy-0.14.0-cp310-cp310-manylinux_2_28_x86_64.whl
Size 632.7 kB
Tags CPython 3.10 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
52b339336deb3304995cca290ca49de3e0b2f6b098e54e98c43e72f60553f898
BLAKE2b-256 checksum
How to use checksums
5b88c4af1c8e59da341b928c22a2269afea6de4ac3b476a318179b7bc741af98
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp310-cp310-macosx_14_0_x86_64.whl

Download URL bocpy-0.14.0-cp310-cp310-macosx_14_0_x86_64.whl
Size 248.8 kB
Tags CPython 3.10 macOS 14.0+ x86-64
SHA-256 checksum
How to use checksums
d1d6de6efd9cd9de77656bb1c9ee51a808b1b2d908468388ea3ad4a3064e7097
BLAKE2b-256 checksum
How to use checksums
50c791b19fd2526fe18f4b16374e1640bcf8809a0cfff72c0fc50e7e84d34877
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / bocpy-0.14.0-cp310-cp310-macosx_11_0_arm64.whl

Download URL bocpy-0.14.0-cp310-cp310-macosx_11_0_arm64.whl
Size 235.9 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f57b810b3c3303881d602acc41a00a9997f7344f996666603f982cbdddfc58fb
BLAKE2b-256 checksum
How to use checksums
919a31e965a36f604486a5fd14d50ce651cfdb8076f56b8ead39798a572de407
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release history Release notifications | RSS feed

This release

0.14.0 This release

31 release files

0.7.0

31 release files

0.6.0

31 release files

0.2.2

31 release files

0.2.1

31 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page