Skip to main content

bocpy is a Python extension that adds Behavior-oriented concurrency built on top of cross-interpreter data.

Project description

bocpy

BOC Logo

Behavior-Oriented Concurrency (BOC) is a new paradigm for parallel and concurrent programming which is particularly well-suited to Python. In a BOC program, data is shared such that each behavior has unique temporal ownership of the data, removing the need for locks to coordinate access. For Python programmers, this brings a lot of benefits. Behaviors are implemented as decorated functions, and from the programmer's perspective, those functions work like normal. Importantly, the programmer's task shifts from solving concurrent data access problems to organizing data flow through functions. The resulting programs are easier to understand, easier to support, easier to extend, and unlock multi-core performance due to the ability to schedule behaviors to run efficiently across multiple sub-interpreters.

BOC has been implemented in several languages, including as a foundational aspect of the research language Verona, and now has been implemented in Python.

Getting Started

You can install bocpy via PyPi:

pip install bocpy

We provide pre-compiled wheels for Python 3.10 onwards on most platforms, but if you have problems with your particular platform/version combination, please file an issue on this repository.

[!NOTE] We provide wheels for Python 3.10 and newer, but bocpy only achieves true parallelism on Python 3.12+, where each sub-interpreter has its own GIL. On 3.10 and 3.11 behaviors still run, but they are serialised by the global GIL. The library may not work on Python versions older than 3.10.

Python version support

The mainline (main) branch in the diagram is the standard CPython build:

  • 3.10 / 3.11 — wheels are published and @when works, but every sub-interpreter still shares one process-wide GIL, so behaviors execute one at a time. Use these versions for portability rather than performance.
  • 3.12+ — each sub-interpreter gets its own GIL (PEP 684), so worker behaviors run in parallel across cores. This is where bocpy delivers on its concurrency story.
  • 3.14 is the current default development and CI target; 3.15 is validated as it stabilises.

The free-threaded branch tracks the no-GIL CPython builds (informally "3.13t", "3.14t", "3.15t" — see PEP 703). bocpy runs unmodified on these interpreters today: we don't re-enable the GIL, and the cown / 2PL protocol gives the same data-race-free guarantees you get on the GIL build. The catch is overhead — on free-threaded Python, the sub-interpreter and XIData machinery is pure ceremony, since plain threads in the main interpreter would already run in parallel.

Issue #5 tracks adding an alternative direct-threading backend that detects a free-threaded interpreter at runtime and skips the sub-interpreter / transpiler / XIData path entirely, while keeping the public Cown / @when API unchanged. We're holding off on that work until the free-threaded build and the relevant CPython APIs stabilise.

Scaling with cores

The chart below shows BOC runtime throughput as the worker count grows from 1 to 8, plotted as speedup relative to a single worker. Numbers come from examples/benchmark.py — a chain-ring workload that exercises the scheduler, two-phase locking, sub-interpreter crossings and the message queue together — run on CPython 3.14 (mean of 3 repeats, 8 s each).

Up to 8 workers, BOC delivers roughly linear scaling on this microbenchmark (≈7.5× at 8 workers). Real applications carry serial costs that this benchmark deliberately strips out — see the docstring at the top of examples/benchmark.py for the load-bearing caveats. To reproduce:

python examples/benchmark.py \
    --sweep-axis workers --sweep-values 1,2,3,4,5,6,7,8 \
    --duration 8 --warmup 2 --repeats 3 \
    --output scaling.json

A behavior can be thought of as a function which depends on zero or more concurrently-owned data objects (which we call cowns). As a programmer, you indicate that you want the function to be called once all of those resources are available. For example, let's say that you had two complex and time-consuming operations, and you needed to act on the basis of both of their outcomes:

def buy_cheese():
    logger = logging.getLogger("cheese_shop")
    for name in all_known_cheeses():
        if is_available(logger, name):
            return name
    
    cleanup_shop(logger)
    return None


def order_meal(exclude: str):
    logger = logging.getLogger("greasy_spoon")
    for dish in menu():
        logger.info(dish)
        if exclude.lower() not in dish.lower():
            logger.info(f"That doesn't have much {exclude} in it")
            return dish

        vikings(logger)
        if random.random() < 0.3:
            logger.info("<bloody vikings>")

    return None


cheese = buy_cheese()
meal = order_meal(exclude="spam")

if meal is not None:
    eat(meal)
elif cheese is not None:
    eat(cheese)

if meal is not None:
    print("I really wanted some cheese...")
elif cheese is not None:
    print("Cheesy comestibles")

return_to_library()

The code above will work, but requires the purveying of cheese and the navigation of the menu for non-spam options to happen sequentially. If we wanted to do these tasks in parallel, we will end up with some version of nested waiting, which can result in deadlock. With BOC, we would write the above like this:

from bocpy import wait, when, Cown

# ...

def buy_cheese():
    cheese = Cown(None)

    @when(cheese)
    def _(cheese):
        logger = logging.getLogger("cheese_shop")
        for name in all_known_cheeses():
            if is_available(logger, name):
                cheese.value = name
                return

        cleanup_shop(logger)

    return cheese


def order_meal(exclude: str):
    order = Cown(None)

    @when(order)
    def _(order):
        logger = logging.getLogger("greasy_spoon")
        logger.info("We have...")
        for dish in menu():
            logger.info(dish)
            if exclude.lower() not in dish.lower():
                logger.info(f"That doesn't have much {exclude} in it")
                order.value = dish
                return

            vikings(logger)
            if random.random() < 0.3:
                logger.info("<bloody vikings>")

    return order


cheese = buy_cheese()
meal = order_meal(exclude="spam")


@when(cheese, meal)
def _(cheese, meal):
    if meal.value is not None:
        eat(meal.value)
    elif cheese.value is not None:
        eat(cheese.value)
    else:
        print("<stomach rumbles>")


@when(cheese, meal)
def _(cheese, meal):
    if meal.value is not None:
        print("I really wanted cheese...")
    elif cheese.value is not None:
        print("Cheesy comestibles!")

    return_to_library()


wait()

You can view the full example here

The BOC runtime ensures that this operates without deadlock, by construction.

Examples

We provide a few examples to show different ways of using BOC in a program:

  1. bocpy-bank: Shows an example where two objects (in this case, bank accounts), interact in an atomic way.
  2. bocpy-dining-philosophers: The classic Dining Philosphers problem implemented using BOC.
  3. bocpy-fibonacci: A parallel implementation of Fibonacci calculation.
  4. bocpy-cooking-boc: The example from the BOC tutorial.
  5. bocpy-boids: An agent-based bird flocking example demonstrating the Matrix class to do distributed computation over cores. Note: you'll need to install pyglet first in order to run the bocpy-boids example.
  6. bocpy-primes and bocpy-prime-factor: parallel prime sieve and Pollard's rho factorisation, the latter coordinating early termination via the noticeboard.
  7. bocpy-calculator: a small Erlang-style calculator service driven by send/receive.
  8. bocpy-cooking-threads: the cooking example written with plain threads, for comparison with bocpy-cooking-boc.
  9. bocpy-sketches: the cheese-and-spam sketch shown above as a runnable script.

Why BOC for Python?

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

This library

Our implementation is built on top of the sub-interpreters mechanism and the Cross-Interpreter Data (XIData) API. As of Python 3.12 each sub-interpreter has its own GIL, so behaviors scheduled by bocpy run truly in parallel.

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

For cross-behavior data sharing that does not warrant a Cown, the library also provides a small noticeboard — a global key-value store of up to 64 entries. Behaviors can notice_write, notice_update (atomic read-modify-write) and notice_delete keys without acquiring any cowns, and read a frozen snapshot via noticeboard() / notice_read(). The bocpy-prime-factor example uses it to coordinate early termination across worker behaviors.

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

Waiting for completion

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

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

Additional Info

BOC is built on a solid foundation of serious scholarship and engineering. For further reading, please see:

  1. When Concurrency Matters: Behaviour-Oriented Concurrency
  2. Reference implementation in C#
  3. OOPSLA23 Talk

Trademarks This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft's Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bocpy-0.6.0.tar.gz (291.6 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.6.0-cp314-cp314-win_amd64.whl (159.1 kB view details)

Uploaded CPython 3.14Windows x86-64

bocpy-0.6.0-cp314-cp314-win32.whl (154.9 kB view details)

Uploaded CPython 3.14Windows x86

bocpy-0.6.0-cp314-cp314-musllinux_1_2_x86_64.whl (391.5 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

bocpy-0.6.0-cp314-cp314-manylinux_2_28_x86_64.whl (397.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

bocpy-0.6.0-cp314-cp314-macosx_14_0_x86_64.whl (163.4 kB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

bocpy-0.6.0-cp314-cp314-macosx_11_0_arm64.whl (158.1 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

bocpy-0.6.0-cp313-cp313-win_amd64.whl (157.0 kB view details)

Uploaded CPython 3.13Windows x86-64

bocpy-0.6.0-cp313-cp313-win32.whl (152.8 kB view details)

Uploaded CPython 3.13Windows x86

bocpy-0.6.0-cp313-cp313-musllinux_1_2_x86_64.whl (391.0 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

bocpy-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl (397.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

bocpy-0.6.0-cp313-cp313-macosx_14_0_x86_64.whl (163.3 kB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

bocpy-0.6.0-cp313-cp313-macosx_11_0_arm64.whl (158.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

bocpy-0.6.0-cp312-cp312-win_amd64.whl (157.1 kB view details)

Uploaded CPython 3.12Windows x86-64

bocpy-0.6.0-cp312-cp312-win32.whl (152.9 kB view details)

Uploaded CPython 3.12Windows x86

bocpy-0.6.0-cp312-cp312-musllinux_1_2_x86_64.whl (392.6 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

bocpy-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl (398.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

bocpy-0.6.0-cp312-cp312-macosx_14_0_x86_64.whl (163.6 kB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

bocpy-0.6.0-cp312-cp312-macosx_11_0_arm64.whl (158.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

bocpy-0.6.0-cp311-cp311-win_amd64.whl (157.5 kB view details)

Uploaded CPython 3.11Windows x86-64

bocpy-0.6.0-cp311-cp311-win32.whl (152.9 kB view details)

Uploaded CPython 3.11Windows x86

bocpy-0.6.0-cp311-cp311-musllinux_1_2_x86_64.whl (387.6 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

bocpy-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl (393.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

bocpy-0.6.0-cp311-cp311-macosx_14_0_x86_64.whl (163.4 kB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

bocpy-0.6.0-cp311-cp311-macosx_11_0_arm64.whl (158.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

bocpy-0.6.0-cp310-cp310-win_amd64.whl (157.5 kB view details)

Uploaded CPython 3.10Windows x86-64

bocpy-0.6.0-cp310-cp310-win32.whl (152.9 kB view details)

Uploaded CPython 3.10Windows x86

bocpy-0.6.0-cp310-cp310-musllinux_1_2_x86_64.whl (380.1 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

bocpy-0.6.0-cp310-cp310-manylinux_2_28_x86_64.whl (385.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

bocpy-0.6.0-cp310-cp310-macosx_14_0_x86_64.whl (163.6 kB view details)

Uploaded CPython 3.10macOS 14.0+ x86-64

bocpy-0.6.0-cp310-cp310-macosx_11_0_arm64.whl (158.5 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for bocpy-0.6.0.tar.gz
Algorithm Hash digest
SHA256 318518d4359072621bc75a0be956e6d134ecf41cb31b8efd5be34d1c49495970
MD5 7a18104ff448978c2cae752372dd8198
BLAKE2b-256 5407315f27cfd847b25dfcf90d04bc52b5cd2dbdfb23213313385714c10c2256

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.6.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 159.1 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.6.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 26f1ac011a3ba70fc81d34018bb994ba5b7ae8caa05e80294a32ca8b3cfdecfb
MD5 65693bc98e58a96f7d671e3efda961d1
BLAKE2b-256 86e96b1e8b95f0b1aa47a4081f816c9b905271d85393a8c2ac3958d9207cefa2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.6.0-cp314-cp314-win32.whl
  • Upload date:
  • Size: 154.9 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.6.0-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 a2068bcdb62f0f0f11061030dc6f7d28fae57cd14679fbce5aa271bee6eb19e7
MD5 fcea0a8b3c84eba6bc36e5fb700eed90
BLAKE2b-256 40b44d8283e709c3557a1743502ef8e441bf75dca560a28a39985227da6b0c58

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d63fcee2b897f4888e5c8eff87ccc3c9f272c12e62080b69dd593ff78ee837dd
MD5 67fe75f20e78ab9788032b1d82486862
BLAKE2b-256 81ebb7554d65acb8c0442713aacb7999e19ba813f05623105f583c73b54481ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 456a78f609933b656550d1930bd6d352a7946d8b437177ef1c86d669a2b14032
MD5 bbe921d2eae4ac2753e622997d8d7156
BLAKE2b-256 7dcc881a4d6c202c86437503bce9435d28f54adc42a6f04abf138ef4dad99505

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 6d7ccbf7caa0e6d5960c6a46dc8195aaf3812016bbe457f0c9f7306d568db37e
MD5 619d69f15214459ea74d90c5597e756a
BLAKE2b-256 f2a0c73a15537135b89400166935a1da374f4f589c9222be5aacbd218f08a9d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ec8bff38226fbe57416aee6c7d39f538792a4922482d7b69d7818ba02bb89ede
MD5 2a40826f3e13386ab86a742127f334cd
BLAKE2b-256 9d6003511d12705047ed37579b70059ed06ba9afb6e4c75fdd0f454f42dcf310

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.6.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 157.0 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.6.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 9968283f1c4410aea3be3d256ec6925095df20f919b8d68108b54368647a09bd
MD5 198648e07cbfec267682f6fd43003ab9
BLAKE2b-256 655027ce3c0f94a39e0242345a45d1736fbd67a89b2a3862e3e01fe2fbebb7c9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.6.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 152.8 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.6.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 4fc8b3d921dc61d8bb887147e8c55b56579f219027ec9ea0979e6544bfa5f805
MD5 5490a3d7a76759ccdc4c000ca01eacdb
BLAKE2b-256 d29df2d3ba45519e52034a93ef1ff18b54b4c9e3e92acd0b0ef58e568f2c87dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0b0c5cf9b671448ca6ff35fed4952451901e013aa91e99a0a03e8c6964f0e2d9
MD5 d789be19c169de04eb0b48e1f7d0b228
BLAKE2b-256 ae51d9e991afbd4f1dc0fda2cbca81610fa873dcf6aac7bf1afdba0fd4b99c34

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 43c53a205fdd52cef4aaad8c001fbc72a2c26056111622a5b841499b39055540
MD5 4bcb52a40a3e8e2296055c8bf6916c8f
BLAKE2b-256 68f12467a5e500560817ed7b1ebd4580498ef4dc51539d68b59eac24ca583efa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 45ad3fb5c7bebe8435c50320b16741bb044dca26479edffc8739c98268c1c608
MD5 11e45847b376f1c8c4ebfc6faa58a5e7
BLAKE2b-256 38d0c8949c3ff2a26d262db05ae6b9284007c5f7a6e0234d740d9318775a72d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2293829b967ce1b76cc1333a325e212989c271fdd7630c31af56408603edd19b
MD5 4a15772faadcb324a2c9b51322255251
BLAKE2b-256 9f1feb1012aa836e2a8831fc9a3c2cc8df8119d05c3682688c6a1e25f73141d1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.6.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 157.1 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.6.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 601a1fb72abc67daa14aab880333a14874e5c9f7a074e5fbd088f858d77357e7
MD5 1c630af1929fca56715ba0f1fd0a0fd9
BLAKE2b-256 37a50ad713a619eefb907ad3549954f69cb5599289d802593f03344bf6136477

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.6.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 152.9 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.6.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 aaec16a18b4c44ba895a39a72157358e6ca7f4121a1bf8c08ec647e23e60b8e6
MD5 be2c2c816ad6a07c158077b07b841064
BLAKE2b-256 40a628c72b7e6b14948a2ac65f76e699c174910a0684c07dfa438a02629b19a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2317f4f6a840f5d8d74b0e11f4f9fa9c78a1d15573e638d7da472c6f9c577ec2
MD5 584847bac92a003284d72849f395a17d
BLAKE2b-256 f146601323ef9baaab01c02cc7e668bc8b4da87cf7a42cd59fc46eb11e5bbb39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cf849d6a1ab0f203a3988bed93e260434b9867526f957a5af2ca0fc584cc8ea1
MD5 6c15fa46c66ae8a2df695998daabd029
BLAKE2b-256 87c0909e01692a5696268adea29cf053e9ddc015bf53e105c79deb9647555f5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 a5a5013e3a24e071669f4567b70cbdab9f598dd4497d799361e155f2244b9695
MD5 58af565d96d3a8c59b5c2d0f8478a372
BLAKE2b-256 ed067e189a4a00ba6f0a46b60840103e993a368e5190a23a5c4ef5986fb46303

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 52ca0ae66b844b8396feadcfd518e1718493d27bf1a653e4193067e64a6f3e4e
MD5 fe72e0c47d1879de9d9a284bb49e7b5d
BLAKE2b-256 6cb0b06c0bc12754e533a372efb4bc6e566876ab01160b00470c3c01d18db823

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.6.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 157.5 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.6.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 38ebd80d4be4950280518225f4e0080b5631752050128b600effec769c3b6d54
MD5 7f600c2865f67af85ad2ede636f56c64
BLAKE2b-256 38ae307dbb28439e5ba01fc7f5e184fdc92304e50916a49dff70703f6bfb01b9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.6.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 152.9 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.6.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 f337412a8f684caad7bd4b47494089c02785003009106805e50e10b6525b3a37
MD5 a836098ea5133f05cc08fef629872827
BLAKE2b-256 869081924408e1da3ddb43f667fd1dbc783f55008ede0445a736fdcd0936b07f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 48913f70288e055d7c3f58455fce0ec366300dbacfc25063aed5922214750459
MD5 a45e84d07fa10652d590f4ce704cc046
BLAKE2b-256 413210020f31599512deae48e04d1ee0c22dfd195604b7ab9fdb9aea15d500f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4e1b651a301de10f9eb87ee5b5bbed4c1105ffe669136e29cee8dfc2afadd5b3
MD5 3ed68588b8d80d182c6c99467110b257
BLAKE2b-256 2336738df1e641ba5aa9f5f26a0467f11e359341f5379f52019327a48189d531

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 fbfc6a627925cff8381a546ee88c16b69973c0fc4f6cd473855fc5797b6cbd71
MD5 34a843bdcab5f1b1653204d208690dbe
BLAKE2b-256 abb72b513397f4610f3ca43f777ca0826a6dd6b9d1b79cc366ca4b23003be073

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7c0698da629a5e6a2cab7a2ebfb0c2264e3328f8702b11ea641a630461a2d9cd
MD5 21cf3d0372bbdfa98db082db970d15e6
BLAKE2b-256 e78067095435fe11b20ef1b422e15bf2a39bec13ec93228b8726dcb458c8ff8d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.6.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 157.5 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.6.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d1d8cc48d6b94126abba53410b46f53f87963f4e1f24efa4c91d4fd278b4ed41
MD5 dc341428f07aec017e2579b2c5283946
BLAKE2b-256 e41d8cf4ede0917d655cdcc82827ee71755cdfb2f7aaec8388eff5a8517af5fa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.6.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 152.9 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.6.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 1bb40e22e6853c1f6a99d2d2ecaa3b79d74c4de804470436b2d1f8d04771e317
MD5 d30be2a750e5b25ec57918b62a568f63
BLAKE2b-256 3d0a9ae195da90b39aef044bae84268d174e1a8055c600ce382699692e175dc9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ffa3b38bfbf458f87f8b61a5d6737ffeb8883fd410f4cebc1b368dadc88e78ac
MD5 4f1638945fc2cbf40023c0aa17ef8cf3
BLAKE2b-256 99acfabe37cf23107b3a2b1fa2f903202c35e2c525da6952fc1d9dbbd401a571

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 854a00a6d3090034febbcd399016cdea2fc6b9254d6684f9c796ecc270fade12
MD5 ebeeeafd9a372ba8077449ae1b8937c3
BLAKE2b-256 3e0acc01543398a082aaf9c10a4bd8864f336892556941b7f29c2d0c39694bcf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp310-cp310-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 a7bc6810aa519f2ce823715c86bbf36da90a494e4c50f6e36406b2bd64598824
MD5 d3e4c3b379582be7b7ced3e0892ae15b
BLAKE2b-256 ceea800f5ae5dfb58c46d915a4c18ccd0063093b8287ca9499b4f49cb5e70418

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.6.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3b3ccb4737c52a98f0cf2809fa57b5c4c8bf18d9ab0d492fa5168dc4aa035837
MD5 436f13ba2fc7a702b0a9950becafafcd
BLAKE2b-256 4cf5396f3f4dac0e38a8cea149928e6453c83c237e76c5abc4eca66b038eeee8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page