slick-stream-buffer-py
A Python implementation of slick-stream-buffer — a lock-free single-producer multi-consumer (SPMC) byte stream buffer with shared memory support.
Maintains exact binary compatibility with the C++ version: a Python producer and a C++
consumer (or vice versa) communicate seamlessly through the same shared memory segment, using
the same std::atomic synchronization primitives.
Tracks C++ slick/stream_buffer.hpp v2.0.0 (header magic 'SSB1'); the two carry the same
version number. The shared memory format is unchanged from v1.x, so a segment written by an
older process is still readable.
Features
- Byte stream, message records: the producer writes raw bytes (
prepare/commit) and publishes them as discrete message records (consume), like a network receive buffer feeding a framing layer - Lock-free SPMC: one producer, any number of consumers, no locks anywhere
- Binary-compatible with C++: identical 64-byte header, 32-byte control records, and
acquire/release memory orderings (
slick/stream_buffer.hpp, header magic'SSB1') - Never touches a segment it does not own: only the process that actually creates a segment initializes it, and an existing one is validated (magic, geometry, mapped size) before a byte is written
- Shared memory IPC: built on
multiprocessing.shared_memory, matching the C++ slick-shm naming conventions on Windows, Linux, and macOS - Lossy by design: slow consumers skip overwritten data instead of blocking the producer, and count it when you ask them to (see Read traits)
- Local memory mode: same API without shared memory for single-process use
- No runtime dependencies: Python 3.8+ standard library plus a small bundled C++ extension for the atomics
Requirements
- Python 3.8+
- 64-bit platform (Windows x86-64, Linux x86-64/ARM64, macOS x86-64/ARM64)
- A C++17 compiler to build the
ssb_atomic_ops_extextension (MSVC 2017+, GCC 5+, Clang 3.8+)
Installation
pip install -e .
# or just build the extension in place:
python setup.py build_ext --inplace
Quick Start
Producer (creates the shared memory segment)
from slick_stream_buffer_py import SlickStreamBuffer
# 64 MB data ring, 65536 message records
stream = SlickStreamBuffer(capacity=1 << 26, control_size=1 << 16, name="market_data")
while True:
mv = stream.prepare(64 * 1024) # contiguous writable memoryview (zero-copy)
n = sock.recv_into(mv) # write network bytes directly into the ring
stream.commit(n)
# publish every complete package as one message record
while (package_size := find_complete_package(stream.data(), stream.size())):
stream.consume(package_size)
Consumer (opens the existing segment — can be C++ or Python)
from slick_stream_buffer_py import SlickStreamBuffer
stream = SlickStreamBuffer(name="market_data") # geometry read from the segment header
cursor = stream.initial_reading_index() # skip history; use 0 to read from the start
while True:
data, length, cursor = stream.read(cursor)
if data is None:
continue
handle_package(data, length)
Read traits
read() takes a per-call configuration, mirroring the C++ template parameter:
class read_traits:
detect_reset = True # resync a cursor that outlived a reset()
count_loss = False # accumulate loss_count()
Ordinary callers write buf.read(cursor) and never name a traits class. Loss counting is
opt-in - in C++ it measured ~20% of read() even in a run that lost nothing - so subclass, or
use the bundled counting_read_traits, when you need it:
from slick_stream_buffer_py import counting_read_traits
data, length, cursor = stream.read(cursor, counting_read_traits)
print(stream.loss_count())
So loss_count() stays 0 unless you read through traits that ask for it - records are still
skipped correctly, only the counter is silent. detect_reset is on by default; turn it off
if you never call reset().
ReadTraits / CountingReadTraits are PEP 8 aliases of the same two classes.
Local memory mode (single process)
buf = SlickStreamBuffer(capacity=1024, control_size=16)
mv = buf.prepare(5)
mv[:] = b"hello"
buf.commit(5)
buf.consume(5) # publish as one record
data, length, cursor = buf.read(0) # -> b"hello", 5, 1
C++ Interoperability
The C++ side uses the identical layout — either side can create the segment, the other attaches to it:
#include <slick/stream_buffer.hpp>
slick::stream_buffer stream("market_data"); // open segment created by Python
uint64_t cursor = stream.initial_reading_index();
for (;;) {
auto [data, length] = stream.read(cursor);
if (data == nullptr) continue;
handle_package(data, length);
}
Shared memory naming: use get_shm_name() to obtain the exact name to pass to C++
(on POSIX it includes the leading / that shm_open() requires; on Windows it is the
raw name).
Shared-memory lifecycle
Only the process that actually creates a segment initializes it - SharedMemory(create=True)
is the OS-backed answer (O_CREAT|O_EXCL on POSIX, ERROR_ALREADY_EXISTS on Windows), so a
name that collides with another application's segment is never overwritten. Constructing with
a geometry over a live segment attaches to it instead: own_buffer is then False and the
existing cursors are left alone.
A crashed creator can leave a segment behind. On POSIX the name survives the process, so:
- if it died part-way through initialization, the segment is stuck in the
INITIALIZINGstate and every later creator and opener fails construction after a 2-second wait; - if it died after initialization, the segment is intact and gets attached with the dead producer's cursors still in it.
Neither is recovered automatically: nothing portable can distinguish a dead creator from a
slow one - a PID stamped in the header means nothing across PID namespaces and is unreliable
under PID reuse - so taking a segment over is an explicit decision. The wedged-segment error
names the step. Call remove() once at startup, when the application knows no other process
is using the segment:
SlickStreamBuffer.remove("my_stream") # clear anything a previous run left
buf = SlickStreamBuffer(capacity=1 << 20, control_size=4096, name="my_stream")
On POSIX remove() unlinks immediately: the next creator gets a fresh segment, while any
process still mapped to the old one keeps reading the orphaned copy. On Windows it is a no-op
returning True - a section there disappears once the last handle closes.
One Python-only caveat: on POSIX before Python 3.13, multiprocessing's resource tracker
unlinks every segment the process mapped when it exits, including ones it only attached to.
Python 3.13+ attaches with SharedMemory(track=False), which is why 3.13 or newer is
recommended when several processes share a segment. remove() unlinks the segment either way,
and retracts the tracker's registration only when this process is the one that registered it -
a name registered by some other process, or by a SharedMemory you built yourself, stays that
owner's to account for. See API_DIFFERENCES.md.
Shared memory layout
[HEADER: 64 bytes]
0-7 atomic<uint64> committed_ - monotonic end of committed bytes
8-15 atomic<uint64> consumed_ - monotonic publish boundary
16-23 atomic<uint64> next_seq_ - next record sequence number
24-31 atomic<uint64> reserve_end_ - prepared-region high-water mark
32-39 uint64 capacity_ - data ring size in bytes (power of 2)
40-43 uint32 control_size_ - control ring record count (power of 2)
44-47 uint32 header_magic - 0x53534231 ('SSB1')
48-51 atomic<uint32> init_state - 0=uninit, 2=initializing, 3=ready
52-63 padding
[CONTROL RING: 32 bytes x control_size]
each record: atomic<uint64> seq | uint64 offset | uint32 length | 12 bytes padding
[DATA RING: capacity bytes]
Total segment size: 64 + 32 * control_size + capacity.
API Summary
| Method | Role | Description |
|---|---|---|
prepare(n) -> memoryview |
producer | contiguous writable region; may relocate unconsumed bytes on wrap |
commit(n) |
producer | move n prepared bytes into the readable region (clamped) |
consume(n) -> PublishedRecord |
producer | publish the first n readable bytes as ONE record (clamped) |
discard() |
producer | drop unconsumed + prepared bytes without publishing |
data() -> memoryview / size() |
producer | the committed-but-unconsumed region |
read(cursor, traits=read_traits) -> (data, length, cursor) |
consumer | next record, or (None, 0, cursor); skips lost records |
read_last() -> (data, length) |
consumer | newest record without a cursor |
initial_reading_index() |
consumer | cursor for a late joiner (skips history) |
loss_count() |
consumer | records skipped by this instance, counting only reads made with count_loss traits |
reset() |
owner | clear all state (not thread-safe) |
close() / unlink() |
lifecycle | detach / delete this instance's segment |
SlickStreamBuffer.remove(name) |
lifecycle | unlink a segment by name - the stale-segment recovery step |
See API_DIFFERENCES.md for the exact deviations from the C++ API (cursor passed by value, bytes copies vs pointers, exceptions).
Caveats (same as C++)
- Producer methods (
prepare/commit/consume/discard/data/size/reset) must be called from a single thread. - The buffer is lossy: if the producer outruns a consumer by more than the control ring or
data ring size, the consumer skips ahead. The loss is counted only for reads made with
traits whose
count_lossis true (see Read traits). prepare()may relocate the readable region: memoryviews previously returned bydata()orprepare()are invalidated.- A single message (one
consume()call) is limited to < 4 GiB:consume()raisesValueErrorrather than publishing a truncated record length. It raises before touching any state, so the bytes stay readable and can go out as several smaller records.
Building and Testing
# 1. Build the atomics extension
python setup.py build_ext --inplace
# 2. Pure-Python tests
python tests/test_atomic_ops.py
python tests/test_local_mode.py
python tests/test_shm_mode.py
# 3. C++ interop tests (requires CMake 3.21+ and a C++20 compiler)
cmake -S . -B build
cmake --build build --config Debug
cd build && ctest -C Debug --output-on-failure
The interop tests fetch slick-stream-buffer
(which pulls slick-shm) from GitHub and build real
C++ producer/consumer binaries against the actual stream_buffer.hpp. To build against local
checkouts instead (no network):
cmake -S . -B build \
-DFETCHCONTENT_SOURCE_DIR_SLICK-STREAM-BUFFER=/path/to/slick-stream-buffer \
-DFETCHCONTENT_SOURCE_DIR_SLICK-SHM=/path/to/slick-shm
The 4 GiB record-limit test needs a 4 GiB ring, so it is skipped unless you opt in:
SSB_PY_TEST_4GIB=1 python tests/test_local_mode.py
If a failed test run leaves segments behind: python tests/cleanup_shm.py, or
SlickStreamBuffer.remove(name) for one you know by name.
Related Projects
- slick-stream-buffer — the C++ implementation
- slick-queue-py / slick-queue — MPMC fixed-element queue with the same interop approach
License
MIT
Metadata
Release files for slick-stream-buffer-py 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| slick_stream_buffer_py-2.0.0.tar.gz | 43.6 kB | Details |
Built distributions (wheels)
Total release size: 663.0 kB
Release files / slick_stream_buffer_py-2.0.0.tar.gz
| Download URL | slick_stream_buffer_py-2.0.0.tar.gz |
|---|---|
| Size | 43.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
007f941d96ae69ab1a9997bf0b27ef40dbbe7641897afa24d8b9b2594e28cb01
|
|
BLAKE2b-256 checksum How to use checksums |
5b6114ea738094a9a29ceba6df99a1485994d84197b071816a4a2f569268a6ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp313-cp313-win_amd64.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 29.6 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
8c897c63769b7fcc37c12bc52e00821c2692e55949f4fa79277db1822718f6a6
|
|
BLAKE2b-256 checksum How to use checksums |
583c07bd3b88a447711f7bf224815bb13cea98991ae37976bd40c0b1a093fd2d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 44.6 kB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
838f85b944570ccce620b996689c6e3d2076e16ec95ab77c839ebeb9470d121a
|
|
BLAKE2b-256 checksum How to use checksums |
f03a18dcc65157ef125d229f5ddba003711fed711d1a8d25901dee94a450d091
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp313-cp313-macosx_10_13_universal2.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp313-cp313-macosx_10_13_universal2.whl |
|---|---|
| Size | 29.0 kB |
| Tags | CPython 3.13 macOS 10.13+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
031ac0f31b938b487fdd697b2ba8eafeea5b20151bcc8b4e54352023e6a89626
|
|
BLAKE2b-256 checksum How to use checksums |
3e20fbc2f85cf274c45b135ca0dd33d7a9cfc5c760be315381fd2cfba65c6ae0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp312-cp312-win_amd64.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 29.6 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
cd2117492e25205296c481047031c4a56374447b1d4aa1e3408f6060480a3aae
|
|
BLAKE2b-256 checksum How to use checksums |
36750d226e5c28416e52b17eedc23882fd0abd78b38c5696319fb283f7362c03
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 44.6 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
e7fdda1eeaf39d5fa02ab76cb61d19b767f53b5d9de75f7b3def45ea8d63d501
|
|
BLAKE2b-256 checksum How to use checksums |
e2ddaad3eae90352b57c46dcac29187dcce00aaabaa418459b02e6bc09e1b2ee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp312-cp312-macosx_10_13_universal2.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp312-cp312-macosx_10_13_universal2.whl |
|---|---|
| Size | 29.0 kB |
| Tags | CPython 3.12 macOS 10.13+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
99f3144cb1259d3f82d30e88ac846061725f18b23dff0024b7247ac5d3e5e04e
|
|
BLAKE2b-256 checksum How to use checksums |
d5de7192d734f46334a711edb6af6e09fac97247388617b85a424d25df161ddc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp311-cp311-win_amd64.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 29.6 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
e8210523c86738a54e171ed37b2e895bb19fddd854f20bc69e88f5959e1d4af4
|
|
BLAKE2b-256 checksum How to use checksums |
3de7b156a928b8c0331deb395495a1cb3af2a55d034a0396d3f4e5ff58c8d698
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 44.7 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
1b67b810c094f422209ad629210e023d7d07296ab712b8a7e7778ca6aef7fd9d
|
|
BLAKE2b-256 checksum How to use checksums |
67fe12b5001687db01340b0317420fc6b4cc6441eef1981874e7ab0c95c99a8a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp311-cp311-macosx_10_9_universal2.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp311-cp311-macosx_10_9_universal2.whl |
|---|---|
| Size | 29.0 kB |
| Tags | CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
20f5958933eb5e3e5b5b4f59a88892622392f764723f22740abef2b5d9c7c3b3
|
|
BLAKE2b-256 checksum How to use checksums |
32df5566dfa3f7592939f3cee220613d84be1c3022077d8dc831c2d3bd2352aa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp310-cp310-win_amd64.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 29.6 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
932d8267c9818f479632dde9436876c89a587eab0eb65443fe9e219a8ec9ab3b
|
|
BLAKE2b-256 checksum How to use checksums |
32a01b21d487c6d1b1da30212b2d0789b52d5d0e4a5447a12b389771fcb70c63
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 44.7 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
4cb99c489e642b4a0762693a1dd7c469161a80902bcfc4ea10bf3c3acc9838b2
|
|
BLAKE2b-256 checksum How to use checksums |
397735c0b04a15c605a0ddd7560ee78981e33171190c5a187e6d40ff9159faee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp310-cp310-macosx_10_9_universal2.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp310-cp310-macosx_10_9_universal2.whl |
|---|---|
| Size | 29.0 kB |
| Tags | CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
c154040657fe661b9160add3a9878d00b0d46dc7b895111b045aad8d3e9963e8
|
|
BLAKE2b-256 checksum How to use checksums |
55266be14d675f4767ad34d9970f39fbbd3f296666a57d554d8e20b64d86ee61
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp39-cp39-win_amd64.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 29.6 kB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
30ff73b60aa4d04c3d47e57d66f341ca62a2a16c61cfff7576558b3b8e94c4ac
|
|
BLAKE2b-256 checksum How to use checksums |
3b4699bc478e13ca77aae915e2f1c1222bae293edc9755e523cc42922ae8c74a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 44.4 kB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
37fa6afecb75229455f03ea0dcaf6a45670de3776b5c0378e80a25dc9c86bf9f
|
|
BLAKE2b-256 checksum How to use checksums |
29ca59bb4aff57cde5f093ac8ae8201f0ff2836156d671a3f84e5806a3fc42e7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp39-cp39-macosx_10_9_universal2.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp39-cp39-macosx_10_9_universal2.whl |
|---|---|
| Size | 29.0 kB |
| Tags | CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
c56631ef641107e62f90c2dad3351a48e2599e10c1c8087008afd7c240f4a361
|
|
BLAKE2b-256 checksum How to use checksums |
433ef0af771fcd89cbc0719854cdcb7f3f7136863c43732328462d7a956cbbd6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp38-cp38-win_amd64.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp38-cp38-win_amd64.whl |
|---|---|
| Size | 29.6 kB |
| Tags | CPython 3.8 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
f570111b56f45054e151f15823f81925df07049a477765cb4629ba37338b88e5
|
|
BLAKE2b-256 checksum How to use checksums |
885016892b17f27cba40f4e3fff5662b1deedfc0958aa8a5854b8fa60ed0e759
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 44.8 kB |
| Tags | CPython 3.8 Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
84fe588349a17f65909c393d87a49ad9c6c18314b12730700ea0e11f795864d7
|
|
BLAKE2b-256 checksum How to use checksums |
3c9cc31c22622cfd8de7605abc979940b03bfb9753c37cf6d0950b91e8ec95c7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / slick_stream_buffer_py-2.0.0-cp38-cp38-macosx_10_9_universal2.whl
| Download URL | slick_stream_buffer_py-2.0.0-cp38-cp38-macosx_10_9_universal2.whl |
|---|---|
| Size | 28.8 kB |
| Tags | CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
ec70f1d8c669295836bc69c78251cdce8e0927c1386a1b219ea29104245ab984
|
|
BLAKE2b-256 checksum How to use checksums |
c84b8159c00e758a071f0146eb2de5882a7cd32bfc16c44d16a768214f417588
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|