Skip to main content

PKIPC SDK 3 — Python 求解器与软件端

面向工业软件调用外部求解器。C++/Python 可以任意组合;本地软件端启动并管理求解器子进程,远程模式连接已部署的求解器。通信使用一条 gRPC 双向流,算法作者只接触配置与自由事件。

python -m pip install .

求解器

import threading
from pkipc import Solver

solver = Solver()
stopped = threading.Event()


@solver.on("math.add")
def add(data):
    return {"result": data["a"] + data["b"]}


@solver.on("stop")
def stop(_):
    stopped.set()


try:
    config = solver.start()
    solver.send("started", config)
    while not stopped.wait(0.02) and not solver.stop_requested():
        pass  # 保留你自己的计算循环
finally:
    solver.close()

求解器由 SDK Client 启动时自动取得连接参数;算法作者不需要配置端口或处理请求匹配。需要请求软件提供数据时,在计算线程调用 solver.request("material.lookup", data)

软件端

import sys
from pkipc import Client

client = Client(sys.executable, args=["solver.py"], config={"threads": 4})
client.on("started", lambda data: print(data))
try:
    client.start()
    result = client.request("math.add", {"a": 20, "b": 22})
    client.send("stop")
    print(client.wait(timeout=5))
finally:
    client.close()

启动 C++ 求解器时,把 executable 换成对应平台的可执行文件即可。Client 还支持 working_directory、environment、start_timeout、stop_timeout。args 是参数数组,不经过 shell。close 先断开会话,给直接子进程退出时间,超时终止并回收。with Client(...) 会自动 start/close;需要预先注册回调时使用上面的显式写法。

自由事件、线程和错误

两端都提供 on/send/request/request_async。事件名使用 ASCII 字母、数字、点、下划线、连字符或斜杠;pkipc. 保留给 SDK。数据为 JSON,包含 null、bool、有限浮点、64 位整数范围、字符串、list、dict。Python tuple、bytes、自定义对象和超范围整数需业务显式转换。

每个会话串行执行事件回调;回调线程与计算主线程并行,使用 Event/Queue/Lock 交换状态。长计算保留在计算线程,避免阻塞暂停等命令回调。同步 request 不允许在事件 handler 内调用;request_async 返回 concurrent.futures.Future。Future 的完成回调在 SDK 线程执行,必须快速返回,不能阻塞等待其他 SDK 工作。

所有 SDK 错误使用 Error,其 code 为 ErrorCode,remote 表示对端业务错误。两种语言错误码和默认消息一致,普通 handler 异常映射 HANDLER_ERROR;显式抛出 Error 保留错误码。单向 handler 错误由 on_error 接收。业务暂停、继续、日志与修改参数都使用普通事件,没有固定求解流程。

send 仅保证本地入队;需要确认时使用 request。超时不代表远端没有执行,SDK 不自动重放请求。close 取消等待中的请求并丢弃未发送消息;计算循环应检查 stop_requested,用户 handler 应能结束。wait 返回子进程退出码,超时返回 None;remote Client 没有本地 PID。

远程与 TLS

求解器使用 Solver(listen="host:port", token=..., tls=TLS(certificate=cert_pem, private_key=key_pem));软件使用 Client(endpoint="host:port", token=..., tls=TLS(roots=ca_pem), config=...)。随后事件接口与本地相同。TLS 使用 PEM bytes,支持客户端证书和 require_client_certificate。

非回环连接默认要求 TLS;受控测试可显式 allow_insecure=True。远程进程由部署系统启动和管理,SDK 管理会话。仓库 examples/solver.py 也支持通过 PKIPC_LISTEN、PKIPC_TOKEN、PKIPC_TLS_CERT、PKIPC_TLS_KEY 配置部署,算法代码不需要改变。

开发与一致性验证

python -m pip install -e ".[test,build]"
python -m pytest -q
python -m ruff check .
python -m build

设置 PKIPC_CPP_SOLVER / PKIPC_CPP_CLIENT 为 C++ 构建产物路径,启用四种语言组合与 TLS 远程交叉测试。未提供二进制时这些用例会明确显示 skipped。C++ 仓库 proto 是权威协议,python tools/sync_protocol.py --source /path/to/PKIPC --check 检查副本一致性;不加 --check 时同步并生成 Python stub。

两个源码仓库在本机时,可以一条命令构建 C++、检查协议副本并运行完整互操作测试:python tools/verify_sdk.py --cpp-source /path/to/PKIPC --cpp-build /short/build/path。已有构建产物时加 --skip-build;该脚本要求 C++ 示例存在,避免误将缺少原生测试当作完整验证。

SDK 3 删除了旧 Server 类和旧运行时,不兼容协议 2。pkipc._session 和 pkipc._listener 是内部实现,不是公开通信框架 API。详细协议和共享数值用例随包发布。支持 Python 3.11+;具体操作系统/依赖组合以 CI 实测为准。

发布到 PyPI

更新 pyproject.toml 与 pkipc.version,提交源码,并准备好同版本的 C++ 构建后:

python -m pip install -e ".[test,build,release]"
python tools/release.py prepare --cpp-source /path/to/PKIPC --cpp-build /short/build/path
python tools/release.py publish --dry-run
python tools/release.py publish

prepare 运行完整互操作测试,从 Git 提交的干净快照构建 wheel/sdist,执行严格元数据检查与安装后的求解器冒烟测试,保存 SHA-256 清单到 dist/版本号。publish 只上传清单中的文件,并核对 PyPI 返回的校验值;同版本的相同文件可续传,不同内容会明确拒绝。默认读取现有环境变量 PYPI_API,也兼容 Twine 的 TWINE_PASSWORD 或 .pypirc 配置。Token 不写进脚本或命令参数。PyPI 版本不可覆盖,后续修改必须使用新版本号。

生命周期操作 start/close/wait/wait_closed 在主线程或应用控制线程调用;在 SDK 回调内调用会返回 invalid_state,避免关闭过程等待当前回调造成死锁。回调通过 atomic/Event/队列通知控制线程退出。Python Future 回调可能在 SDK 线程执行,也应保持非阻塞。

Release files for PKIPC 3.0.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 PKIPC 3.0.0
File Size Uploaded
pkipc-3.0.0.tar.gz 32.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for PKIPC 3.0.0
File Interpreter ABI Platform
pkipc-3.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 57.2 kB

Release files / pkipc-3.0.0.tar.gz

Download URL pkipc-3.0.0.tar.gz
Size 32.1 kB
Tags Source
SHA-256 checksum
How to use checksums
52d27409a92e8d91063b72c800b0092d31170e7460158891dda4db96dd16cac6
BLAKE2b-256 checksum
How to use checksums
712e6b5adf59419807def324b9af205a0281bbf9bd4d2afc246fde5e76f546cd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.7

Release files / pkipc-3.0.0-py3-none-any.whl

Download URL pkipc-3.0.0-py3-none-any.whl
Size 25.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
430fdc26d8001e57efd967b9f880d573840f4b54fe8fc702c7044b1c464794ec
BLAKE2b-256 checksum
How to use checksums
1528d3fb0baa2501fd668283a1261bba0722f5183a15afe1e300b3dfdb7ccdda
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.7

Release history Release notifications | RSS feed

This release

3.0.0 This release

2 release files

2.0.1

2 release files

2.0.0

2 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